Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 为什么我可以创建多个服务器套接字,但只能创建一个客户端?_Sockets - Fatal编程技术网

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()。
这是正常用法。