【问题标题】:socket programming with select使用 select 进行套接字编程
【发布时间】:2011-03-02 06:25:02
【问题描述】:

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

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

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);
}

【问题讨论】:

    标签: c sockets network-programming select-function


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      相关资源
      最近更新 更多