Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++:使用select()_C++_Sockets_Select - Fatal编程技术网

C++:使用select()

C++:使用select(),c++,sockets,select,C++,Sockets,Select,我正在构建一个客户机,它可以从服务器和用户stdin接收信息,所以我使用select来监视这两个。发生的情况是,当我向客户端发送消息并返回消息时,键盘输入被监控,没有问题。但是当服务器发送消息时,什么也没有发生,我也不知道为什么。使用select是否是正确的方法 这是我的密码: void readSocket(fd_set tempfd) { const char * tweet, * inMessage; if (FD_ISSET(srverfd,&tempfd)) {

我正在构建一个客户机,它可以从服务器和用户stdin接收信息,所以我使用select来监视这两个。发生的情况是,当我向客户端发送消息并返回消息时,键盘输入被监控,没有问题。但是当服务器发送消息时,什么也没有发生,我也不知道为什么。使用select是否是正确的方法

这是我的密码:

void readSocket(fd_set tempfd) {
    const char * tweet, * inMessage;
    if (FD_ISSET(srverfd,&tempfd)) {
        inMessage = getMessage();
        printSystemMessages(inMessage);
    }

    if (FD_ISSET(STDIN_FILENO,&tempfd)) {
        tweet = getUserTweet();
        sendMessage(tweet);
        inMessage = getMessage();
        if (strcmp(inMessage,OK) != 0) {
            printSystemMessages(inMessage);
        }
        if (strcmp(inMessage,EXIT) == 0) {
            return;
        }
    }
    return;
}

int main (int argc, char *argv[] ){
    int value;
    bool clientON = false;
    fd_set tempfd;

    if(establishConnection(argv[2],argv[3])){
        cerr << "usage: failed to make connection" << endl << "exiting..." << endl;
        exit(EXIT_FAILURE);
    }

    cout << "Connected successfully" << endl;
    sendMessage("CONNECT "+clientName); //Connect
    if(strcmp(getMessage(),OK) == 0){
        build_select_list();
        printSystemMessages("Welcome!");
        clientON = true;
        cout<< man <<endl;
    }
    while(clientON){
        tempfd = inputFdSet;
        printTweetFormat("TweetMy:");

        value = select(maxSock, &tempfd, NULL, NULL, NULL);
        if (value < 0) {
            perror("select");
            exit(EXIT_FAILURE);
        }
        if (value == 0) {
            continue;
        }
        else {
            readSocket(tempfd);
        }
    }
    close(srverfd);

    return 0;
}

这可能会帮助您-将maxSock+1而不是maxSock传递给select调用

从手册页中选择

     nfds  is the highest-numbered file descriptor in any of the three sets,
      plus 1.

这可能会帮助您-将maxSock+1而不是maxSock传递给select调用

从手册页中选择

     nfds  is the highest-numbered file descriptor in any of the three sets,
      plus 1.

关于select的用法,您可以参考。您有上面的两个主要功能-您可以真正清理这些功能,使事情更清楚,然后更有可能获得answer@curiousbill-我读了好几遍,都找不到答案。你的例子甚至没有编译。。。如果没有代码,任何人怎么能发现错误。除非客户机请求数据,否则通常不会从服务器接收数据。您是说服务器正在向客户机写入数据,而客户机没有发出请求吗?服务器通常使用listen和accept来执行此操作。客户端通常在等待请求答复时只读。有关select的用法,请参阅。您有两个以上的主要功能-您可以真正清理这些功能,使事情更清楚,然后更有可能获得answer@curiousbill-我读了好几遍,都找不到答案。你的例子甚至没有编译。。。如果没有代码,任何人怎么能发现错误。除非客户机请求数据,否则通常不会从服务器接收数据。您是说服务器正在向客户机写入数据,而客户机没有发出请求吗?服务器通常使用listen和accept来执行此操作。客户机通常在等待请求的答复时只读。这是一个很好的观点。但是,由于maxSock没有在这个代码段的任何地方定义,因此您永远无法知道它是否已经包含+1:@EitanT-确实如此-这就是为什么我说这可能会有所帮助:这是一个非常好的观点。但是,由于maxSock没有在这个代码段中的任何地方定义,因此您永远无法知道它是否已经包含+1:@EitanT-确实如此-这就是为什么我说这可能会有所帮助: