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

Posted

技术标签:

【中文标题】linux c socket错误:输入/输出错误【英文标题】:linux c socket error: Input/output error 【发布时间】:2013-05-26 18:58:36 【问题描述】:

当我尝试将数据发送到 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() 调用中出现错误。

【问题讨论】:

请添加一些代码,这是查看哪里出错的最佳方法。 if (tv.tv_sec - sockArr[i].heartBeatSendTime >= beatTim) if (send(sockArr[i].sendSockFd, szBuffer, packetSize, 0) != packetSize) fprintf(stderr , "心跳包发送失败:[%d][%s]\n", errno, strerror(errno)); if (errno == EBADF || errno == ECONNRESET || errno == ENOTCONN || errno == EPIPE) Debug("链接丢失\n");侦察(一);继续; 其他 sockArr[i].heartBeatSendTime = tv.tv_sec; if (sockArr[i].status == SOCK_IN_FLY) sockArr[i].heartBeatRecTime = tv.tv_sec; send() 调用发生错误 对不起,我的意思是在问题中(只是编辑它),格式看起来会更好:) 请显示“sockArr”的定义 【参考方案1】:

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

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

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

【讨论】:

以上是关于linux c socket错误:输入/输出错误的主要内容,如果未能解决你的问题,请参考以下文章

linux 下socket编程.获取网络地址那句怎么改,才能打印出点分10进制的ip地址.//段错误

linux c 段错误如何定位

[linux] 输入&输出&错误流

Linux标准输入标准输出错误输出

linux重定向标准输入输出,标准错误

Linux shell标准输入,标准输出,错误输出