Recv有时只提供错误的文件描述符(运行程序它工作正常,有时它不起作用)

场景:我有一个客户端(订阅者),其中包含编译和工作的代码,我有所说客户端的服务器,我可以在不同的bash窗口运行它,我有printf来显示我正在发送什么消息,服务器得到了什么,看看客户是否收到确认……一切。 在代码的某些地方可能存在问题但是它或多或少有效,因为我可以发送消息等(这都在本地机器上)。

我停止程序运行,再次执行,并且可能发生两件事:它正常工作,我可以再次发送任何消息,或者当我尝试从客户端发送到服务器时,服务器关闭并且客户也是如此,没有收到确认。

我想解释一下,如果没有我编译或做任何事情,就会发生这种情况。 启动程序,再次运行,有时会失败。

我到目前为止唯一的事情(因为我对每次使用的电话都感到恐惧)是:

RECV错误:文件描述符错误

我得到了这段代码:

if((longitudRecibida=recv(fdSocketDevuelto, &longitudTema, sizeof(int), 0)) < 0){ close(sock_tcp); perror("RECV error"); exit(1); } 

我没有放更多代码的原因是因为我根本不知道如何重现失败。 有时它工作正常,没有任何一点它停止,有时我发送的第一个消息使两个进程都失败。

当发生这种情况时,当我打印客户端的IP地址,而不是我得到的通常的127.0.0.1时,我得到:

 Peer IP address: 2385:6095:e37f:: 

为了得到那个打印我使用:

 char ipstr[INET6_ADDRSTRLEN]; if (addr.ss_family == AF_INET) { struct sockaddr_in *s = (struct sockaddr_in *)&addr; port = ntohs(s->sin_port); inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr); } else { // AF_INET6 struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr; port = ntohs(s->sin6_port); inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr); } printf("Peer IP address: %s\n", ipstr); 

我不知道为什么recv会工作一段时间而不是其他人。

编辑:我可以添加任何要求的信息我只是不知道我应该寻找什么。