Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
C 仅接收消息的消息传递应用程序的一个实例_C_Linux_Sockets - Fatal编程技术网

C 仅接收消息的消息传递应用程序的一个实例

C 仅接收消息的消息传递应用程序的一个实例,c,linux,sockets,C,Linux,Sockets,在下面的代码中,我有3个函数(包括main)。receive\u loop函数轮询绑定到127.0.0.1的套接字,如果它收到任何消息,就会打印它。sender\u循环使用scanf等待用户输入,当有输入时,它通过绑定到127.0.0.1的套接字发送。main在子循环中分叉并运行sender\u循环,在父循环中分叉并运行receive\u循环 现在,如果我编译代码并运行此可执行文件的两个实例,则无论哪个实例首先启动,都会收到任一实例发送的消息。比如说,instance1首先启动,然后instan

在下面的代码中,我有3个函数(包括
main
)。
receive\u loop
函数轮询绑定到
127.0.0.1
的套接字,如果它收到任何消息,就会打印它。
sender\u循环
使用
scanf
等待用户输入,当有输入时,它通过绑定到
127.0.0.1
的套接字发送。
main
在子循环中分叉并运行
sender\u循环
,在父循环中分叉并运行
receive\u循环

现在,如果我编译代码并运行此可执行文件的两个实例,则无论哪个实例首先启动,都会收到任一实例发送的消息。比如说,instance1首先启动,然后instance1接收instance1和instance2发送的消息。我不知道为什么会发生这种情况,如果有人能解释一下(细节),我将不胜感激。谢谢

//未显示包含项
//接收环
int-receive\u循环(int-sock\u fd,struct-sockaddr*peer){
int isDataReady=0;
char buff[128]={0};
结构pollfd poll_结构;
poll_struct.fd=sock_fd;
poll_struct.events=POLLIN;
printf(“接收器启动\n”);
而(1){
而(1){
如果(isDataReady>0)中断;
isDataReady=poll(&poll_struct,1500);
}
socklen\u t sock\u len=sizeof(结构sockaddr);
recvfrom(sock_fd,
浅黄色,
sizeof(浅黄色),
0,
(结构sockaddr*)对等,
&袜子);
printf(“%s\n”,浅黄色);
}
返回0;
}
//发送器环路
int sender_循环(int sock_fd,struct sockaddr*peer){
char buff[32]={0};
printf(“发送方向上\n”);
而(1){
扫描频率(“%s”,浅黄色);
int bytes_sent=sendto(sock_fd,buff,sizeof(buff),0,(struct sockaddr*)对等,sizeof(struct sockaddr_in));

如果(bytes_sent您的第二个实例在
bind()
上失败,因为它正试图绑定到第一个实例已经使用的端口

换成这个,看看

int ret = bind(sock_fd, (struct sockaddr *)peer, sizeof(struct sockaddr_in));
if (ret < 0)
{
    perror("bind");
    exit(1);
}
int ret=bind(sock_fd,(struct sockaddr*)对等,sizeof(struct sockaddr_in));
如果(ret<0)
{
佩罗(“绑定”);
出口(1);
}

但是为什么第二个实例仍然能够发送消息?它应该不能正确地接收或发送消息?在调用bind之前,您还可以使用SETSOCKTOP的SO_REUSEADDR设置来避免绑定失败。程序的两个实例都将运行。当传入数据包时,其中一个实例将运行处理数据包。对于SOCK_DGRAM(UDP),您肯定不能保证从特定主机发送的数据包将由同一程序实例处理。@mtahmed-UDP套接字仍然允许“发送”如果它们没有绑定到特定端口。操作系统将选择一个随机未使用的值作为源端口。事实上,由于您使用相同的端口进行发送和接收,您自己的设计可能会导致发送程序接收他发送的消息。标准设计是让客户端选择一个随机端口号(即,在调用bind之前,将端口号设置为0),然后将此类用户的存在通知在已知IP:port上侦听的服务器。您是否考虑过只使用本地“服务器”所有客户端连接到的进程,然后它将消息重定向到相应的目的地?@selbie非常感谢man提供的详细答案和建议。实际上,我正在尝试这样做,以便我可以使用点对点连接与同一网络上的其他人交谈。但我想在某个时候,某种程度上需要一台服务器。是的,我确实意识到使用相同的端口和ip发送接收消息是愚蠢的。再次非常感谢。我非常感谢。
int ret = bind(sock_fd, (struct sockaddr *)peer, sizeof(struct sockaddr_in));
if (ret < 0)
{
    perror("bind");
    exit(1);
}