2013-05-31 163 views
1

当我尝试向tcp服务器发送数据时,出现“输入/输出错误”错误。这对套接字来说意味着什么?它基本上相同的代码我一直使用正常。我希望有人能告诉我,当我试图通过套接字发送以及如何检查/修复它们时,输入/输出错误的原因是什么。任何帮助表示赞赏。linux c socket error:输入/输出错误

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()通话发生。

+0

请添加一些代码,这是查看问题出在哪里的最好方法。 – Nobilis

+0

如果(tv.tv_sec - sockArr [I] .heartBeatSendTime> = BEATTIM){ \t如果(!发送(sockArr [I] .sendSockFd,szBuffer,PACKETSIZE,0)= PACKETSIZE){ \t \t fprintf中(错误,“心跳包发送失败:[%d] [%s] \ n“,errno,strerror(errno)); \t \t如果(错误== EBADF ||错误号== ECONNRESET ||错误号== ENOTCONN ||错误号== EPIPE){ \t \t \t调试( “链路失去连接\ n”); \t \t \t Reconn(i); \t \t \t继续; \t \t} \t} \t否则{ \t \t sockArr [I] .heartBeatSendTime = tv.tv_sec; \t \t如果(sockArr [I] .STATUS == SOCK_IN_FLY) \t \t \t sockArr [I] .heartBeatRecTime = tv.tv_sec;在发送发生 \t}} 的 –

+0

误差()调用 –

回答

2

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

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

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

+0

非常感谢! –