我正在创建一个回显服务器,当客户端闲置时间超过maxWaitTime时,会断开连接。
我希望程序能够阻塞套接字,直到客户端发送数据,但是当我在gdb中运行程序时,它会通过select并在Readline上阻塞。
我知道无论何时经过select时retval = 0,并且fd_set sock变成[256,(31个零)],在select之后,sock变成[32个零]。
连接的接受发生在另一个函数中,并将连接描述符传递给echo函数。
如果您能够帮助我指出正确的方向或让我知道如何在一定时间后断开客户端,请告诉我。
如果您需要更多信息,请告诉我。
提前致谢!
我希望程序能够阻塞套接字,直到客户端发送数据,但是当我在gdb中运行程序时,它会通过select并在Readline上阻塞。
我知道无论何时经过select时retval = 0,并且fd_set sock变成[256,(31个零)],在select之后,sock变成[32个零]。
连接的接受发生在另一个函数中,并将连接描述符传递给echo函数。
如果您能够帮助我指出正确的方向或让我知道如何在一定时间后断开客户端,请告诉我。
如果您需要更多信息,请告诉我。
提前致谢!
FD_ZERO(&sock);
FD_SET(sockfd,&sock);
int opt = 3;
setsockopt(sockfd, SOL_SOCKET, SO_RCVLOWAT,&opt,sizeof(opt));
timeout.tv_sec = maxWaitTime;
timeout.tv_usec = 0;
for ( ; ; ) {
FD_SET(sockfd,&sock);
printf("Set is %d\n",FD_ISSET(sockfd,&sock));
int retval;
retval = select(1, &sock, NULL, NULL, &timeout);
if(retval)
{
quitProgram(number);
}
else
{
printf("n is %d\n",retval);
if ( (n = Readline(sockfd, line, MAXLINE)) == 0)
{
return; /* connection closed by other end */
}
Writen(sockfd, line, n);
}
`
select
的第一个参数应该是最高编号的套接字加一。在你的情况下是sockfd + 1
。另外,我猜你的超时时间maxWaitTime
不为零? - Some programmer dudeselect
在出错时返回-1
,仅在超时时返回零,并且如果套接字已准备好,则返回正数(实际上是三个集合中准备就绪的套接字数量)。因此,您不能仅通过检查返回值是否为非零来判断错误。 - Some programmer dude