我的套接字程序是服务器-客户端结构。
奇怪的是,TCP套接字只是构造(客户端连接和服务器接受)的可能性很小。
并且我使用select而不是读取套接字,它将返回-1且errno为104(对等连接重置)。
但是我既不发送服务器也不发送任何消息,也不发送任何客户端消息,通常情况下,它应该阻塞选择功能(我的选择功能未设置超时限制),但读取功能返回-1。
为什么会发生?或者我该如何获得更多详细信息来调试此问题?
谢谢你们。
平台:Ubuntu 13.04 64bits,gcc编译器
我的代码的最低版本:
服务器:
for(;;)
{
rset= allset;
select(maxfd+1, &rset, NULL, NULL, NULL);
//read socket
if( FD_ISSET(fconn[i].fd, &rset) )
{
len=read(fconn[i].fd, &tcp_buf.b[4], PACKET_LENGTH);
//the connection will close
if( len<0 )
{
printf("%s, fconn %s read length:%d, errno:%d(%s), close connection\n", crtTime(), fconn[i].ip, len, errno, strerror(errno) );
close( fconn[i].fd );
FD_CLR( fconn[i].fd, &allset );
}
}
//construct new connection
if( FD_ISSET(forwardSockfd, &rset) )
{
clilen= sizeof(cliaddr);
connfd= accept( forwardSockfd, (struct sockaddr*)&cliaddr, &clilen );
inet_ntop( AF_INET, &cliaddr.sin_addr, ip, sizeof(ip) );
client_port= (int)cliaddr.sin_port;
//set send buffer size
int sendBuf= SOCKET_BUF_LENGTH;
setsockopt(connfd, SOL_SOCKET, SO_SNDBUF, &sendBuf, sizeof(sendBuf));
FD_SET( connfd, &allset );
}
}
客户(我的阅读功能):
int readline(int fd, void* ptr, int len)
{
int rtn= len;
void* bp= ptr;
int rc;
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
while( len>0 )
{
select(fd+1, &fdset, NULL, NULL, NULL);
rc=read(fd, bp, len);
if(rc>0)
{
bp+= rc;
len-= rc;
}
else
{
return rc;
}
}
return rtn;
}
它将返回-1并且errno为104(对等方重置连接)
因此,连接被对等方重置。那可以随时发生。这是您无法控制的。正确的操作是合上插座,然后将其遗忘。连接不再存在。尝试选择并再次读取它只是放错了位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句