1

私はクライアントサーバーアプリケーションを作成しており、pollを使用して複数のクライアントソケットとstdinの間で多重化しており、コマンドを挿入できます(例:サーバーを停止します)。私のコードの構造(「ロジック」)は正しいと思いますが、期待どおりに動作していません。

struct pollfd pfd[NSERVER]; //defined as 10
pfd[0].fd = fileno(stdin);
pfd[0].events = POLLIN;
pfd[1].fd = socktfd; //server bind, listen socket
pfd[1].events = POLLIN;
struct sockaddr_storage remoteaddr; // client address
socklen_t addrlen;
char remoteIP[INET6_ADDRSTRLEN];
addrlen = sizeof remoteaddr;
char buf[1024];     // buffer
int pos=2;  

while(poll(pfd,1,0) >= 0)
{
    if(pfd[0].revents & POLLIN) { //stdin
            //process input and perform command
        }
    if(pfd[1].revents & POLLIN) {
        /* new connection */
        int connsockfd = accept(socktfd, (struct sockaddr *)&remoteaddr,&addrlen);  
        pfd[pos].fd=connsockfd;
    }
    int i=2;
    //Loop through the fd in pfd for events
    while (i<=NSERVER)
    {
        if (pfd[i].revents & POLLIN) {
            int c=recv(pfd[i].fd, buf, sizeof buf, 0);
            if(c<=0) {
                if (c==0)
                {
                /* Client closed socket */
                    close(pfd[i].fd);
                }
            }else
            {//Client sent some data
                c=send(pfd[i].fd,sbuff,z,0);
                if (c<=0)
                {
                    Error;
                }
            free(sbuff);
            }
        }
        i++;
    }
}

コードを読みやすくするために、recvとsend内のコードをいくつか削除しました。動作に失敗します(ハングするか、接続を受け入れないか、stdinからの入力に反応します)。

注:選択よりもポーリングを使用したいので、選択をポイントしないでください:-)。

よろしくお願いします。

4

1 に答える 1

3
  1. をすべて設定する必要がpfd[i].fd = -1あるため、最初はpoll()によって無視されます。
  2. poll(pfd, 1, 0)間違っているので、少なくともそうする必要がpoll(pfd, 2, 0)ありpoll(pfd, NSERVER, 0)ます。
  3. while(i<=NSERVER)する必要がありますwhile(i<NSERVER)

初期化されておらず、.fdと.reventsのランダムな値を含むpfd配列をループするため、プログラムがハングする可能性があります。そのため、ブロックする可能性のあるランダムなFDでsend()またはrecv()を実行する必要があります。ループif(pdf[i].fd < 0) {i++; continue;}で行います。i<NSERVER

pfd[pos].events = POLLINまた、新しく受け入れられたソケットには設定しません。POLLOUT送信するものがない限り、設定しないでください。ほとんどの場合、トリガーされます。

于 2012-12-16T13:12:01.783 に答える