gpt4 book ai didi

linux - 使用 select 系统调用阻止 recvfrom

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:50 25 4
gpt4 key购买 nike

我有一个 UDP 客户端,它必须从两个不同的套接字接收数据。
我正在使用 select 系统调用来复用 recv 调用。

但我看到客户端在第二次 recv 调用中被阻止。

我该如何解决这个问题?

struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
int activity;

FD_ZERO(&socketfds);
FD_SET(usocket,&socketfds);
max_sd = std::max(max_sd, usocket);
FD_SET(msocket,&socketfds);
max_sd = std::max(max_sd, msocket);
rset = socketfds;

do
{
rset = socketfds;
activity = select( max_sd + 1 , &rset , NULL , NULL , &timeout);
}
while(activity<0 && errno == EINTR);

if ((activity < 0) && (errno!=EINTR))
{
printf("select error");
}
if(FD_ISSET(usocket, &socketfds))
{
int len;
printf("Receiving from unicast socket..\n");
if((len = recvfrom(usocket, dataBuffer, dataLength, 0, (struct sockaddr *)
&clientAddr, &clen) < 0) )
{
printf("Error reading message \n");
close(msocket);
exit(-1);
}
else
{
printf("Size of message: %d\n", strlen(dataBuffer));
handleMessage(dataBuffer);
}
}
if(FD_ISSET(msocket, &socketfds))
{
printf("Receiving from multicast socket..\n");
if((recvfrom(msocket, dataBuffer, dataLength, 0, (struct sockaddr *)
&multicastClientAddr, &mlen) < 0) )
{
printf("Error reading message \n");
close(msocket);
exit(-1);
}
else
{
printf("Message from server:%s\n", dataBuffer);
handleMessage(dataBuffer);
}
}

最佳答案

您需要检查通过 select 返回(修改)的 rset 以查看套接字是否准备好读取 - 这些位将始终在 socketfds 中设置,因为那是您要等待的主套接字集。所以改变

if(FD_ISSET(Xsocket, &socketfds))

线到

if(FD_ISSET(Xsocket, &rset))

关于linux - 使用 select 系统调用阻止 recvfrom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18621352/

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