Sockets 为什么我可以创建多个服务器套接字,但只能创建一个客户端?
考虑以下代码:Sockets 为什么我可以创建多个服务器套接字,但只能创建一个客户端?,sockets,Sockets,考虑以下代码: { int Socket1=套接字(PF_INET、SOCK_STREAM、IPPROTO_TCP); SrcSockAddr中的sockaddr_; 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,si
{
int Socket1=套接字(PF_INET、SOCK_STREAM、IPPROTO_TCP);
SrcSockAddr中的sockaddr_;
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)))
出口(1);
DstSockAddr中的sockaddr_;
DstSockAddr.sin_family=PF_INET;
DstSockAddr.sin_addr.s_addr=inet_addr(“192.168.1.3”);
DstSockAddr.sinu端口=htons(5061);
if(连接(Socket1,(sockaddr*)和dstockaddr,sizeof(dstockaddr)))
出口(2);
int Socket2=套接字(PF_INET、SOCK_STREAM、IPPROTO_TCP);
if(-1==bind(Socket2,(sockaddr*)&SrcSockAddr,sizeof(SrcSockAddr)))
出口(3);
DstSockAddr.sinu端口=htons(5062);
if(连接(Socket2,(sockaddr*)和(DstSockAddr),sizeof(DstSockAddr)))
出口(4);
出口(0);
}
假设两个地址都是正确的,执行结果将是3。我不能将两个套接字绑定到一个地址,这完全有道理。然而,在服务器环境中,accept()返回的不是像connect()这样的结果代码,而是另一个描述符。因此,我可以有多个传入连接到一个地址,但只有一个传出连接 有什么原因吗?
编辑:
嗯,我刚刚发现bind()不是必需的。但是如何设置数据包的源端口呢?您正在将两个套接字进程绑定到同一个
structaddr.port
。这是你做不到的。更改另一个具有不同端口号的SocketAddress结构,您就可以了。
IP+端口必须是唯一的
if( -1 == bind(Socket1, (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) )
if( -1 == bind(Socket2,
(sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) ) //SrcSockAddr already in use
不能将两个套接字绑定到同一IP:端口。但是,您可以从绑定到IP:端口的侦听套接字
accept()。所有这些套接字都将IP:port作为其本地地址,但这是由于从侦听套接字继承了它,而不是由于bind()
函数。否。他根本没有创建任何服务器套接字。它们都是客户端套接字。listen()在任何地方都不会被调用,但connect()会被调用。@EJP Mmmn,我明白了。。bind的使用让我很困惑。你可以bind()
客户端套接字,尽管没有很多好的理由这么做。嗯,嗯。。有一种不使用bind()创建客户端套接字的方法?@MadRunner当然有。您只需调用socket()
,然后调用connect()。
这是正常用法。