0

考虑以下代码:

{
    int Socket1 = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    sockaddr_in SrcSockAddr;
    SrcSockAddr.sin_family = PF_INET;
    SrcSockAddr.sin_addr.s_addr = inet_addr("192.168.1.2");
    SrcSockAddr.sin_port = htons(5061);

    if( -1 == bind(Socket1, (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) )
       exit(1);

    sockaddr_in DstSockAddr;
    DstSockAddr.sin_family = PF_INET;
    DstSockAddr.sin_addr.s_addr = inet_addr("192.168.1.3");
    DstSockAddr.sin_port = htons(5061);

    if( connect(Socket1, (sockaddr*)&DstSockAddr, sizeof(DstSockAddr)) )
        exit(2);


    int Socket2 = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    if( -1 == bind(Socket2, (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) )
        exit(3);

    DstSockAddr.sin_port = htons(5062);
    if( connect(Socket2, (sockaddr*)&(DstSockAddr), sizeof(DstSockAddr)) )
        exit(4);

    exit(0);
}

假设两个地址都是正确的,则执行结果将是 3。我不能将两个套接字绑定到一个地址,这完全有道理。
然而,在服务器情况下,accept() 返回的不是像 connect() 这样的结果代码,而是另一个描述符。所以我可以有多个传入连接到一个地址,但只有一个传出。

这有什么原因吗?


编辑:
嗯,好吧,我刚刚发现 bind() 不是必需的。但是如何设置数据包的源端口呢?

4

2 回答 2

0

您将两个套接字进程绑定到同一个structaddr.PORT. 这是你做不到的。用不同的端口号更改另一个 socketaddr 结构,你应该没问题。IP+PORT 必须是唯一的。

if( -1 == bind(Socket1, (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) )

 if( -1 == bind(Socket2,
 (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) ) //SrcSockAddr already in use
于 2012-10-15T06:08:52.197 回答
0

您不能将两个套接字绑定到同一个 IP:端口。但是,您可以accept()从绑定到 IP:port 的侦听套接字中获得与待处理的入站连接一样多的套接字。所有这些套接字都有那个 IP:port 作为它们的本地地址,但是通过从侦听套接字继承它,而不是通过bind()函数。

于 2012-10-15T06:22:52.137 回答