簡體   English   中英

主函數和線程函數中的不同套接字描述符

[英]Different socket descriptor in main and thread function

我的主要功能代碼如下所示

 if (argc < 2 || argc > 4)
    {
        printf("usage: server <port> [<ip>]\n");
        exit(1);
    }

    TCPStream* stream = NULL;
    TCPAcceptor* acceptor = NULL;
    if (argc == 3)
    {
        acceptor = new TCPAcceptor(atoi(argv[1]), argv[2]);
    }
    else
    {
        acceptor = new TCPAcceptor(atoi(argv[1]));
    }

    if (acceptor->start() == 0)
    {
        while (1)
        {
            stream = acceptor->accept();
            if (stream != NULL)
            {
                /*
                ssize_t len;
                char line[256];
                while ((len = stream->receive(line, sizeof(line))) > 0) {
                    line[len] = 0;
                    printf("received - %s\n", line);
                    stream->send(line, len);
                    */
                cout << "in main" << stream->getsockdescriptor() << endl;
                pthread_t sniffer_thread;
                if( pthread_create( &sniffer_thread, NULL, connection_handler, (void*)&stream) < 0)
                {
                     perror("could not create thread");
                     return 1;
                }
                //Now join the thread , so that we dont terminate before the thread
                pthread_join( sniffer_thread , NULL);
             }
                delete stream;
          }
       }
    exit(0);
}

線程功能代碼如下所示

void *connection_handler(void * args)
{
    TCPStream *stream = (TCPStream *)args;
    ssize_t len;
    char line[256];
    cout << "check1" << endl;
    cout << stream->getsockdescriptor() << endl;
    while ((len = stream->receive(line, sizeof(line))) > 0)
    {
        cout << "check2" << endl;
        line[len] = 0;
        printf("received - %s\n", line);
        stream->send(line, len);
    }

}

即使我將對象傳遞給線程函數。 我得到了不同的文件描述符值。 主要顯示正確。Start(),Accept(),receive()是包裝函數

問題是pthread_create調用和您在此處傳遞的參數:

pthread_create( &sniffer_thread, NULL, connection_handler, (void*)&stream)

在這里,你不傳遞一個指向TCPStream對象(即TCPStream* ),而是一個指向指針TCPStream對象(即TCPSTream** )。

這將導致線程函數發生不確定的行為 ,因為您將指針視為指向TCPStream的指針。

只需在調用pthread_create時刪除地址運算符& ,它應該開始工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM