1

挨拶 !!

私はソケットサーバーとして開発されたLinuxでunpv13eライブラリを使用し、(最大で)3つのソケットクライアントを受け入れるポートをリッスンします。各クライアントには独自のスレッドがあります....

これらの 3 つのクライアントは非常に迅速に送信しますが、ソケット サーバーの recv 関数は、文字列の半分が client1 からのものであり、別の半分が client2 からのものであると受け取ります。ソケットIDが違うので、なぜそうなったのか興味がありますか? 次のコードで説明させてください。

listenfd = Tcp_listen(ipaddr,portno,&addrlen);
cliaddr = Malloc(addrlen);
Signal(SIGINT, sig_int);
for ( ; ; ) {
    clilen = addrlen;
    connfd = Accept(listenfd, cliaddr, &clilen);
    err_msg("id [%05d] conned from %s",connfd,Sock_ntop(cliaddr, clilen));
    Pthread_create(&tid, NULL, &doit, (void *) connfd);
}


void * doit(void *arg)
{
    void web_child(int);
    Pthread_detach(pthread_self());
    web_child((int) arg);
    Close((int) arg);
    printf("thread [%05d] dead...\n",(int) arg);
    return(NULL);
}


void web_child(int sockfd)
{
    int        connfd;
    ssize_t    nread;
    char       line[1024];

    for ( ; ; )
    {
        line[0]=0x00 ;
        if ( (nread = Readline(sockfd, line, 1024)) == 0)
            break;         /* connection closed by other end */
        line[nread-2]=0x00 ;
        if(strncmp(line,"101",3)==0)
            Do101(line) ;
        if(strncmp(line,"201",3)==0)
            Do201(line) ;
        if(strncmp(line,"301",3)==0)
            Do301(line) ;
    }
}

unpv13e ライブラリの readline 関数は recv を呼び出し、'\n' になるまで一度に 1 文字ずつチェックして戻ります。nread は通常 315 バイト程度で、このソケット サーバーに send がありません!! 私の意見では、web_child 関数は異なる socketfd で thread として実行され、行は local var であるため、3 つの異なるクライアントが互いに影響を与えることはありません。ソケット client1 は常に "101" で始まる文字列を送信し、client2 は常に"201" を送信、client3 は "301" を送信 ....

しかし、 Do101(line) に文字列が表示されることがあります。最初の半分は "101" で、後半は client2 から来ています。これらの 3 つのクライアントが非常に頻繁に送信すると、互いに影響します。 、それは起こるかもしれません...あまり頻繁ではありませんが、ただ起こったのです!!

コードにどのようなバグがありますか? 異なるスレッドの異なる socketid からの recv は互いに影響しますか?

どんな提案でも大歓迎です!! ありがとう !!

4

2 に答える 2

2

Readline()1 バイトしか受信しない場合、次の行は失敗します。

line[nread-2]=0x00 ;

次のように変更してみてください。

line[nread-1]=0x00 ;
于 2011-11-21T08:36:26.287 に答える
2

これはあなたが使用しているライブラリですか? https://github.com/k84d/unpv13e/

readline 関数はスレッドセーフではないようです。それらは静的バッファを使用し、同時アクセスを防ぐために何も使用しません。

于 2011-11-21T08:36:03.150 に答える