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错误:输入/输出错误的主要内容,如果未能解决你的问题,请参考以下文章