gpt4 book ai didi

c - 我第一次使用 poll(),是否需要无限循环?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:24 25 4
gpt4 key购买 nike

我正在尝试使用 poll,因为我之前对 select() 的使用由于在单个进程中监视了超过 1024 个文件描述符而失败。我的程序必须使用 connect() 同时检查数千个 IP 地址和端口。知道宿主是否健康是一种询问。我将每个查询放在不同的线程中。这是我的功能

int connect_nonb(struct sockaddr_in sa , int sock, int timeout)
{
int flags = 0, error = 0, ret = 0;
socklen_t len = sizeof(error);
struct timeval t_struct;
struct pollfd pfd;
pfd.fd = sock;
pfd.events = POLLERR|POLLOUT;
pfd.revents = 0;
//set socket nonblocking flag
if( (flags = fcntl(sock, F_GETFL, 0)) < 0)
return -11;

if(fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0)
return -12;

//initiate non-blocking connect
if( (ret = connect(sock, (struct sockaddr *)&sa, sizeof(rtinetaddr_tp))) < 0 ){
if (errno != EINPROGRESS)
{
return errno;
}
}
if(ret == 0){ //then connect succeeded right away
goto done;
}
//we are waiting for connect to complete now
if( (ret = poll(&pfd, 1,timeout)) < 0){
return -1;
}
if(ret == 0){ //we had a timeout
errno = ETIMEDOUT;
return errno;
}

if(ret > 0){
if(getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0){
return errno;
}
}

if(error){ //check if we had a socket error
errno = error;
return errno;
}

done:
if(fcntl(sock, F_SETFL, flags) < 0){
return -1;
}

我的唯一目标是减少连接的默认超时时间,并且上述相同的功能在这方面表现正确。

但在我看到的一些例子中,poll 被用在一个无限循环中。我还应该使用无限循环吗?仅供引用,我正在检查每个线程的这些连接。我找到了一个很好的引用 here

最佳答案

是的,您需要循环调用 poll(2) (或 select(2) 如果您使用过它)。 This answer详细解释了为什么(以及如何)......

关于c - 我第一次使用 poll(),是否需要无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23064411/

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