gpt4 book ai didi

c - linux: stdin 导致 select 在我不希望它返回时返回

转载 作者:太空狗 更新时间:2023-10-29 12:07:16 26 4
gpt4 key购买 nike

当 stdin 上有内容时,我在 select 返回时遇到问题,即使我不希望它返回。例如,这里有一个代码,用于等待套接字上的数据一段时间,但是如果标准输入上有数据,则选择返回:

int mylib_UDP_Client_Recv(int sock, void *data, int max_length, int timeout)
//timeout is taken to be milliseconds
{
struct sockaddr_in sdata;
struct timeval timeouts;

timeouts.tv_sec = timeout / 1000;
timeout -= timeouts.tv_sec * 1000;
timeouts.tv_usec = timeout * 1000;

int n;
int maxfd = sock;
fd_set static_rdset, static_wrset, rdset, wrset;
unsigned int datalen = sizeof(struct sockaddr_in);

FD_SET(sock,&static_rdset);
FD_SET(sock,&static_wrset);


rdset = static_rdset;
wrset = static_wrset;
if (select(maxfd+1,&rdset,NULL,&wrset,&timeouts) == 0) //wrset used as exception set
{
return -1; //timed out
}
if (FD_ISSET(sock,&rdset))
{
n = recvfrom(sock,data,max_length,0,(struct sockaddr *)&sdata,&datalen);
if (n < 0) return 0;
return n;
}
else
{
return 0; //error
}
}

最佳答案

永远不要在任何 fd_set 上使用 FD_ZERO()。 FD 0 (stdin) 可能与其他各种随机 FD 一起设置。

关于c - linux: stdin 导致 select 在我不希望它返回时返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6591528/

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