【问题标题】:Different socket descriptor in main and thread function主函数和线程函数中的不同套接字描述符
【发布时间】:2015-10-15 12:00:52
【问题描述】:

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

 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() 是包装函数

【问题讨论】:

    标签: c++ multithreading sockets


    【解决方案1】:

    问题在于 pthread_create 调用和您传递的参数:

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

    这里您传递的不是指向TCPStream 对象(即TCPStream*)的指针,而是指向TCPStream 对象(即TCPSTream**)的指针。

    这将导致线程函数中的未定义行为,因为您将指针视为指向TCPStream 的指针。

    在调用pthread_create 时只需删除操作符&amp; 的地址,它就应该开始工作了。

    【讨论】:

    • 是的,我在 pthread_create 函数的第四个参数中删除了“&”。现在可以正常工作
    • 您还需要移除演员表。如果您没有使用 void* 强制转换关闭编译器,您会看到编译错误而不是神秘行为。
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多