gpt4 book ai didi

c - 选择时的套接字阻止和超时

转载 作者:行者123 更新时间:2023-12-03 11:50:44 24 4
gpt4 key购买 nike

我当前正在创建一个echo服务器,该服务器在处于空闲状态的maxWaitTime之后将断开客户端的连接。

我希望程序会阻塞套接字,直到客户端发送数据为止,但是当我在gdb中运行程序时,它会通过选择并在Readline上阻塞。

我知道retval = 0,只要它通过选择,并且fd_set socks 进入[256,(31个零)],选择之后, socks 就进入[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);

}

`

最佳答案

正如其他人所评论的那样,您的代码中存在一些逻辑漏洞。经您自己承认:

I know retval = 0 whenever it goes through the select and that the fd_set sock goes to [256, (31 zeroes)] and after the select, sock goes to [32 zeroes].



那应该向您表明出了点问题。退出 fd_set后,该套接字不在 select()中,这意味着该套接字尚不可读。 retval=0表示 select()超时。

您不仅必须在每次调用 fd_set时重置 select(),还必须重置 timeval。尝试以下方法:
int opt = 3; 
setsockopt(sockfd, SOL_SOCKET, SO_RCVLOWAT,&opt,sizeof(opt));

for ( ; ; )
{
timeout.tv_sec = maxWaitTime;
timeout.tv_usec = 0;

FD_ZERO(&sock);
FD_SET(sockfd,&sock);

int retval = select(sockfd+1, &sock, NULL, NULL, &timeout);
if (retval <= 0)
{
quitProgram(number); /* error or connection timed out */
}
else
{
if ( (n = Readline(sockfd, line, MAXLINE)) <= 0)
{
return; /* error or connection closed by other end */
}

Writen(sockfd, line, n);
}
}

关于c - 选择时的套接字阻止和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602134/

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