gpt4 book ai didi

c - 使用 select 进行套接字编程

转载 作者:行者123 更新时间:2023-12-02 00:34:36 25 4
gpt4 key购买 nike

我有两个节点通过套接字进行通信。每个节点都有一个读线程和一个写线程来相互通信。下面给出的是读取线程的代码。使用该代码的两个节点之间的通信工作正常。但我试图在此线程中添加一个选择功能,这给我带来了问题(选择代码在注释中。我只是取消注释以添加功能)。问题是一个节点不接收消息,只接收超时。另一个节点从另一个节点获取消息但从不超时。如果没有选择(保留注释/* */),则不存在该问题(两个节点都发送和接收消息)。

谁能指出可能是什么问题?谢谢。

void *Read_Thread(void *arg_passed)
{
int numbytes;
unsigned char *buf;
buf = (unsigned char *)malloc(MAXDATASIZE);

/*
fd_set master;
int fdmax;
FD_ZERO(&master);
*/

struct RWThread_args_template *my_args = (struct RWThread_args_template *)arg_passed;

/*
FD_SET(my_args->new_fd, &master);
struct timeval tv;
tv.tv_sec = 2;
tv.tv_usec = 0;
int s_rv = 0;
fdmax = my_args->new_fd;
*/

while(1)
{
/*
s_rv = -1;
if((s_rv = select(fdmax+1, &master, NULL, NULL, &tv)) == -1)
{
perror("select");
exit(1);
}
if(s_rv == 0)
{
printf("Read: Timed out\n");
continue;
}
else
{
printf("Read: Received msg\n");
}
*/
if( (numbytes = recv(my_args->new_fd, buf, MAXDATASIZE-1, 0)) == -1 )
{
perror("recv");
exit(1);
}
buf[numbytes] = '\0';

printf("Read: received '%s'\n", buf);
}
pthread_exit(NULL);
}

最佳答案

在循环中每次调用 select() 之前,您必须设置 mastertv。它们都由 select() 调用修改。

特别是,如果 select() 返回 0,则 master 现在将为空。

关于c - 使用 select 进行套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5164128/

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