【问题标题】:When the client socket should be bound in order to receive UDP messages from a server?何时应该绑定客户端套接字以便从服务器接收 UDP 消息?
【发布时间】:2011-10-17 10:45:18
【问题描述】:

我看过两个例子,说明客户端套接字如何从服务器接收消息。

示例 1:

服务器代码 http://man7.org/tlpi/code/online/book/sockets/ud_ucase_sv.c.html

客户端代码 http://man7.org/tlpi/code/online/book/sockets/ud_ucase_cl.c.html

客户端程序创建一个套接字并将该套接字绑定到一个地址,以便服务器可以发送它的回复。

if (bind(sfd, (struct sockaddr *) &claddr, sizeof(struct sockaddr_un)) == -1)
    errExit("bind"); // snippet from ud_ucase_cl.c

示例 2:

服务器代码 http://man7.org/tlpi/code/online/book/sockets/i6d_ucase_sv.c.html

客户端代码 http://man7.org/tlpi/code/online/book/sockets/i6d_ucase_cl.c.html

在示例 2 中,客户端代码未将其套接字与地址绑定。

问题

客户端代码是否需要将套接字与地址绑定才能接收来自服务器的消息?

为什么在第一个示例中,我们必须将客户端套接字与地址绑定,为什么在第二个示例中不需要?

【问题讨论】:

    标签: c linux ubuntu-10.04 udpclient


    【解决方案1】:

    区别在于 socket family - 第一个示例使用 AF_UNIX,而第二个示例使用 AF_INET6。根据Stevens UNP,您需要明确bind Unix 客户端套接字的路径名,以便服务器具有可以向其发送回复的路径名:

    ... 将数据报发送到未绑定的 Unix 域数据报套接字不会将路径名隐式绑定到套接字。因此,如果我们省略这一步,服务器对recvfrom 的调用...返回一个空路径名...

    INET{4,6} 套接字不需要这样做,因为它们“自动绑定”到临时端口。

    【讨论】:

      【解决方案2】:

      如果您在连接/发送之前没有绑定 AF_INET/AF_INET6 客户端套接字,TCP/IP 堆栈会自动将其绑定到出站地址上的临时端口。

      与此不同,UNIX 域套接字(AF_UNIX)在发送时不会自动绑定,因此您可以通过 SOCK_DGRAM 发送消息但无法得到任何回复。

      【讨论】:

        【解决方案3】:

        对于客户端(TCP)或发送者(UDP),调用bind()是可选的;这是一种指定接口的方法。假设你有两个接口,它们都可以路由到你的目的地:

        eth0: 10.1.1.100/24
        eth1: 10.2.2.100/24
        
        route: 10.1.1.0/24 via 10.2.2.254  # router for eth1
               0.0.0.0     via 10.1.1.254  # general router
        

        现在如果你只是说connect()12.34.56.78,你不知道哪个本地接口提供连接的本地端。通过首先调用bind(),您可以明确这一点。

        UDP 流量也是如此:没有bind()ing,您的sendto() 将使用随机源地址和端口,但使用bind(),您可以指定源。

        【讨论】:

        • 那为什么在第二个例子中,我们不必使用 bind 仍然可以向服务器发送消息?
        • 您可以始终发送消息。您只是无法控制源接口和​​端口。
        猜你喜欢
        • 2011-08-15
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 2020-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多