1

サーバーとユーザー()から情報を受信できるクライアントを構築している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;
}
4

1 に答える 1

1

これはあなたを助けるかもしれません-あなたのselect()呼び出しにmaxSockの代わりにmaxSock+1を渡します;

select()のマニュアルページから

     nfds  is the highest-numbered file descriptor in any of the three sets,
      plus 1.
于 2012-06-16T10:57:57.160 に答える