2

当我尝试将数据发送到 tcp 服务器时出现“输入/输出错误”错误。就套接字而言,这意味着什么?它与我使用的代码基本相同,总是运行良好。当我尝试通过套接字发送时,我希望有人能告诉我输入/输出错误的原因是什么,以及如何检查/修复它们。任何帮助表示赞赏。

struct SOCKETSTUS {
int sendSockFd;
int recvSockFd;
short status;
long heartBeatSendTime;
long heartBeatRecTime;
long loginPackSendTime;
};

struct SOCKETSTUS sockArr[128];

if (tv.tv_sec - sockArr[i].heartBeatSendTime >= beatTim) 
{ 
   if (send(sockArr[i].sendSockFd, szBuffer, packetSize, 0) != packetSize) 
   { 
     fprintf(stderr, "Heartbeat package send failed:[%d][%s]\n", errno, strerror(errno)); 
     if (errno == EBADF || errno == ECONNRESET || errno == ENOTCONN || errno == EPIPE) 
     { 
       Debug("link lose connection\n"); Reconn(i); continue; 
     } 
   } 
   else 
   { 
     sockArr[i].heartBeatSendTime = tv.tv_sec; 
     if (sockArr[i].status == SOCK_IN_FLY)      
         sockArr[i].heartBeatRecTime = tv.tv_sec; 
   } 
}

错误发生在send()调用中。

4

1 回答 1

2

您的错误检查不正确。 send()返回发送的字节数或错误时返回 -1。您只检查返回值是否等于packetSize而不是返回值指示错误。 有时send()在流套接字上返回的字节数会少于请求的字节数

所以,一些以前的系统调用(可能是一个无害的失败的 tty 操作?一个狡猾的信号处理程序?)设置errno为 EIO。

更改您的代码以将 -1 与“短”发送不同。

于 2013-05-31T04:08:40.933 回答