gpt4 book ai didi

c - select() 系统调用不会解锁

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:10 24 4
gpt4 key购买 nike

我无法让 select() 系统调用解锁。我正在尝试多路复用来自一组 3 个套接字的数据输入。我在称为 sock[] 的整数数组中为每个接口(interface)创建一个套接字。如果我取消注释第一个 block ,我就可以毫无问题地在每个套接字上接收数据。有了它的评论,我永远不会通过对 select() 的调用。你能看出我在 select() 设置和调用方面可能做错了什么吗?

//This block will receive data from sock[0], sock[1], and sock[2] when left uncommented
/*n = recvfrom(sock[2], buf, 1500,0,(struct sockaddr*)&recvaddr, &recvaddrlen);
printf("\nrecieved\n");
print_buf(buf);*/

fd_set sockets;
FD_ZERO(&sockets);
for(i=0; i<3; i++){
FD_SET(sock[i], &sockets);
}


select(3, &sockets, NULL, NULL, NULL);
printf("\nSocket selected\n");
for(i=0; i<3; i++){
//Check for connected sockets
if(FD_ISSET(i, &sockets)){
printf("\nSocket %d", i);
n = recvfrom(sock[i], buf, 1500,0,(struct sockaddr*)&recvaddr, &recvaddrlen);
}
}

最佳答案

您为 nfds 参数传递了错误的值。

http://linux.die.net/man/2/select

“nfds 是三组中编号最大的文件描述符,加 1。”

你想要的是这样的

int maxsock =0;
for(i=0; i<3; i++){
FD_SET(sock[i], &sockets);
if (sock[i] > maxsock) maxsock = sock[i]
}


select(maxsock+1, &sockets, NULL, NULL, NULL);

关于c - select() 系统调用不会解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36363166/

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