代码之家  ›  专栏  ›  技术社区  ›  Bernie Perez

C中的UDP套接字

  •  5
  • Bernie Perez  · 技术社区  · 15 年前

    我正在做一道功课。我想启动一个UDP服务器来监听文件请求。它打开文件并用UDP将其发送回请求的客户机。

    这是服务器代码。

        // Create UDP Socket
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
            perror("Can't create socket");
            exit(-1);
        }
    
        // Configure socket
        memset(&server, 0, sizeof server);
        server.sin_family = AF_INET; // Use IPv4
        server.sin_addr.s_addr = htonl(INADDR_ANY); // My IP
        server.sin_port = htons(atoi(argv[1])); // Server Port
    
        // Bind socket
        if ((bind(sockfd, (struct sockaddr *) &server, sizeof(server))) == -1) {
            close(sockfd);
            perror("Can't bind");
        }
    
        printf("listener: waiting to recvfrom...\n");
        if (listen(sockfd, 5) == -1) {
            perror("Can't listen for connections");
            exit(-1);
        }
    
    while (1) {
        client_len = sizeof(struct sockaddr_in);
        newsockfd = accept(sockfd, (struct sockaddr*)&client,&client_len);
    
        if (newsockfd < 0) {
            perror("ERROR on accept");
        }
    
        // Some how parse request
        // I do I use recv or recvfrom?
        // I do I make new UDP socket to send data back to client?
    
        sendFile(newsockfd, filename);
    
        close(newsockfd);
    }
    
    close(sockfd);
    

    我有点迷路了怎么从客户那里接收数据?如何建立一个新的UDP连接到客户端?

    4 回复  |  直到 9 年前
        1
  •  12
  •   user3458 user3458    15 年前

    UDP与TCP的区别:

    • 面向消息,而不是面向流。你不读/写或发送/接收。您发送到/接收来自。消息大小限制为64K。每个对recvfrom的调用都会得到一条由对sendto的调用发送的消息。如果recvfrom传递的缓冲区小于消息的大小,则消息的其余部分将永远消失。

    • 没有连接。因此没有监听/接受/连接。向特定地址/端口发送消息。当您收到消息(在套接字绑定到的地址/端口上)时,您会将传入消息的源作为recvfrom的输出参数。

    • 没有保证。消息可能会被丢弃或接收不正常。如果我没记错的话,它们不能被截断。

    最后一句警告-你可能会发现自己正在重新发明TCP over UDP。在这种情况下,停止并返回TCP。

        2
  •  12
  •   Robel Sharma Ravi    7 年前

    我写了一封信 C语言中的UDP服务器客户端 ,其中客户端发送一个注册号,服务器给出一个名称作为反馈。

    服务器

    0. Variable initialization
    1. sock()
    2. bind()
    3. recvfrom()
    4. sendto()
    

    客户

    0. gethostbyname()
    1. sock()
    2. bzero()
    4. sendto()
    5. recvfrom()
    

    希望有帮助。您可以在这里找到示例代码 udp server/client

        3
  •  2
  •   Chris Dodd    15 年前

    accept仅用于面向连接(流)的套接字。UDP不是面向流的,因此没有连接,并且不能使用accept(2)--它将返回EOPNOTSUPP。

    相反,您只需直接从绑定的服务套接字读取数据包(通常使用recvfrom(2),这样您就可以知道您的数据包来自何处,尽管您可以使用recv,如果您不在乎的话,也可以直接读取),然后您就可以使用相同的套接字将数据包发送回去(通常使用sendto(2))

        4
  •  1
  •   leeeroy    15 年前

    请记住,UDP是无连接的。它只发送数据包,不适合发送文件-除非整个内容适合一个UDP数据包。

    如果您想发送/接收UDP数据包,只需调用 sendto / recvfrom 有合适的地址。