gpt4 book ai didi

c - 为什么套接字无限返回-1(errno :104)

转载 作者:可可西里 更新时间:2023-11-01 02:36:06 26 4
gpt4 key购买 nike

我的套接字程序是服务器-客户端结构。

奇怪的是,TCP套接字刚刚构造(客户端连接和服务器接受)的可能性很小。

我使用 select 而不是读取套接字,它将返回 -1 并且 errno 为 104(连接由对等方重置)。

但我既不发送服务器也不发送任何客户端,以正常方式它应该在选择函数处阻塞(我的选择函数没有设置超时限制),但是读取函数返回 -1。

为什么会这样?或者我怎样才能获得更多细节来调试这个问题?

谢谢大家

平台:ubuntu 13.04 64位,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;
}

最佳答案

it will return -1 and errno is 104(Connection reset by peer)

所以连接被对方​​重置了。这随时都可能发生。这是你无法控制的。正确的操作是关闭套接字并忘记它。连接不再存在。试图再次选择和阅读它只是错误的乐观主义。

关于c - 为什么套接字无限返回-1(errno :104),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21151315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com