考虑以下代码:
{
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() 不是必需的。但是如何设置数据包的源端口呢?