c - C 中的 UDP 套接字

标签 c sockets udp

我正在做类作业。我想启动一个监听文件请求的 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 连接?

最佳答案

UDP 与 TCP 的区别:

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

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

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

最后一句警告 - 您可能会发现自己在 UDP 之上重新发明了 TCP。在那种情况下,停止并返回到 TCP。

关于c - C 中的 UDP 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829187/

相关文章:

c - Unix 路径搜索 C 函数

c - 使用 GDB 在 x86 机器上进行 MIPS 反汇编;可能的?

c++ - 无法分配请求的地址,C++ UDP 套接字

谁能告诉我如何在sunsolaris系统中运行udp客户端服务器程序?

c - 我的 C 程序跳过 fprinf 并且没有将数据写入指定文件,特别是在第一个 printf 之后

c - MMX SSE 到 C 代码转换时图像质量下降

c++ - C++11 中会(并且应该)有套接字吗?

python - 如何在python中从telnet连接接收数据

java - 不在同一 IP 范围内时无法连接 Socket。 (子网)

c - 多线程udp服务器