当我尝试将数据发送到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()
次来电时出现错误。
答案 0 :(得分:2)
您的错误检查不正确。 send()
返回发送的字节数或错误时的-1。您只检查返回值是否等于packetSize
,不是,返回值表示错误。 Sometimes send()
on a stream socket will return fewer bytes than requested
那么,一些以前的系统调用(也许是一个无害的tty操作?一个狡猾的信号处理程序?)将errno
设置为EIO。
将您的代码更改为-1,与“短”发送不同。