【问题标题】:UDP Sockets in CC中的UDP套接字
【发布时间】:2010-12-22 04:47:42
【问题描述】:

我正在处理课堂作业问题。我想启动一个侦听文件请求的 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 连接?

【问题讨论】:

  • 您应该咨询Beej's Guide to Network Programming。它详细介绍了网络编程的基础知识。它涵盖了第 5 章中的系统调用,您可以在其中找到有关 recvrecvfrom 的信息。

标签: c sockets udp


【解决方案1】:

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

如果您仍然想发送/接收 UDP 数据包,只需使用适当的地址调用 sendto/recvfrom

【讨论】:

  • 下一部分是将文件分成多个部分,然后使用 SR 或 GBN 发送。
【解决方案2】:

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

相反,您只需直接从绑定的服务套接字读取数据包(通常使用 recvfrom(2),这样您就可以知道您的来源,尽管您可以使用 recv 或者如果您不关心就直接读取),之后您可以使用同一个套接字发回数据包(通常使用 sendto(2))

【讨论】:

  • 谢谢,这对我的问题最有帮助。如果没有人有我可以效仿的好榜样,这将是公认的答案。
【解决方案3】:

UDP 与 TCP 有何不同:

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

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

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

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

【讨论】:

  • 这就是重点。它不是对 TCP 的完全重新发明,它只是 RDT,而不是拥塞控制或 TCP 的任何其他特性。
  • 只要确定你不需要你留下的 TCP 功能。
  • connect 适用于 UDP。您可以使用它为send/write 设置默认目的地,而不是使用sendto
【解决方案4】:

我用 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

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 2015-12-14
    • 1970-01-01
    • 2018-04-03
    • 2017-10-28
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多