2013-05-31 123 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

非常感謝! –