gpt4 book ai didi

c - 为什么 select() 在第一次超时后总是返回 0

转载 作者:IT王子 更新时间:2023-10-29 00:22:52 27 4
gpt4 key购买 nike

当我在 Linux 套接字程序上工作时,我遇到了一个关于 select 函数的问题。如果客户端在服务器配置的时间间隔内连接到服务器端,则选择功能可以正常工作,如手册页所述。如果发生超时,select 函数将永远返回 0。当时调试客户端,发现客户端已经连上了服务器。但是 select 函数仍然返回 0。我搜索了这个问题,但没有找到任何帮助。有人能知道为什么 select 会那样做吗?我的linux版本是RHEL5.4。感谢您的帮助。

代码如下所示。

static const int maxLog = 10000;

int main()
{
int servSock;
signal(SIGPIPE, SIG_IGN);
if((servSock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
printf("socket create fail\n");
exit(-1);
}
int val = 1;
if(setsockopt(servSock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))<0)
{
DieWithUserMessage("setsockopt error");
}

struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(22000);

if(bind(servSock, (struct sockaddr *) &serverAddr,
sizeof(serverAddr)) < 0)
{
printf("socket bind fail\n");
exit(-1);
}

if(listen(servSock, maxLog) < 0)
{
printf("listen failed\n");
exit(-1);
}

fd_set read_set;
FD_ZERO(&read_set);
FD_SET(servSock, &read_set);
int maxfd1 = servSock + 1;
std::set<int> fd_readset;

for(;;){
struct timeval tv;
tv.tv_sec = 5;
int ret = select(maxfd1, &read_set, NULL, NULL, tv);
if(ret == 0)
continue;

if(ret < 0)
DieWithUserMessage("select error");

if(FD_ISSET(servSock, &read_set))
{
struct sockaddr_in clntAddr;
socklen_t clntAddrlen = sizeof(clntAddr);
int clntSock = accept(servSock, (struct sockaddr *) &clntAddr, &clntAddrlen);
if(clntSock < 0)
{
printf("accept failed()");
exit(-1);
}

maxfd1 = 1 + (servSock>=clntSock? servSock:clntSock);
FD_SET(clntSock, &read_set );
fd_readset.insert(clntSock);
}

}
}

最佳答案

'select()'功能使用起来令人沮丧;你每次调用它之前都必须设置它的参数,因为它会修改它们。您所看到的是如果您不在循环中每次都设置 fd_set(s) 会发生什么的演示。

关于c - 为什么 select() 在第一次超时后总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3324078/

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