linux c socket错误:输入/输出错误

时间:2013-05-31 02:57:59

标签: c linux sockets

当我尝试将数据发送到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()次来电时出现错误。

1 个答案:

答案 0 :(得分:2)

您的错误检查不正确。 send()返回发送的字节数或错误时的-1。您只检查返回值是否等于packetSize不是,返回值表示错误。 Sometimes send() on a stream socket will return fewer bytes than requested

那么,一些以前的系统调用(也许是一个无害的tty操作?一个狡猾的信号处理程序?)将errno设置为EIO。

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