使用select进行套接字编程

3
我有两个节点通过套接字进行通信。每个节点都有一个读线程和一个写线程来与另一个节点通信。以下是读线程的代码。使用此代码,两个节点之间的通信正常工作。但是,我正在尝试在此线程中添加select函数,并且这给我带来了问题(选择功能的代码在注释中。我只需取消注释以添加功能)。问题是一个节点不接收消息,只超时。另一个节点从另一个节点接收消息,但从未超时。没有select(保留注释/* */)时不存在该问题(两个节点发送和接收消息)。
请问有人能指出可能的问题吗?谢谢。
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);
}
1个回答

3

在循环内的每次调用 select() 前,您必须设置好 mastertv。它们会被 select() 调用修改。

特别地,如果 select() 返回了 0,那么 master 现在将为空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接