1

select を使用して、同じソケット記述子 (サーバー側) のクライアント/サーバーで送受信したいと考えています。

timestruct* myTime;
sockfd = accept(listeningFd, 0, 0);

while(1)
    FD_ZERO(&my_fd_set)
    maxFd = sockfd
    FD_ZERO(&my_fd_set);
    FD_SET(sockfd, &my_fd_set);
    select(maxFd+1, &my_fd_set, &my_fd_set, NULL, myTime);

    for (j=0; j<=maxFd; j++)

    if(FD_ISSET(j, &temp_fd_set))
        if(j==sockfd)
            send()
        if(j==sockfd)
            recv()

これは本質的に私がやりたいことです。sockfd は送信と受信で同じ値になるため、明らかにこれは機能しません。fork() を使わずにこれを行う方法はありますか?? 現在、recv と send をブロックしていますが、クライアントに送り返すために別のコマンドが処理されている間に、サーバーが複数のコマンドを recv する必要がある場合があります。私は c と 'select()' についてよく知っています。select には fd_set の 3 つのオプション (読み取り、書き込み、実行) があるため、これを実行できるのではないかと考えました。

ありがとうございました。

4

1 に答える 1

3

rfdsとのwfdsパラメータにとの異なるセットを使用して、 が一方のセットにある場合と他方のセットにないselect場合を区別できるようにします。sockfd

fd_set rfds;
fd_set wfds;
FD_ZERO(&rfds);
FD_ZERO(&wfds);

FD_SET(sockfd, &rfds);
FD_SET(sockfd, &wfds);
if(select(sockfd + 1, &rfds, &wfds, NULL, myTime) < 0) {
    perror("select");
    return -1;
}

if(FD_ISSET(sockfd, &rfds))
    recv();
if(FD_ISSET(sockfd, &wfds))
    send();
于 2012-09-19T03:34:22.177 に答える