2015-10-15 170 views
1

我的主要功能代碼如下所示不同的socket描述

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); 
    } 

} 

即使我傳遞的對象線程功能。我得到不同的文件描述符值。 在主它顯示correct.Start(),接受(),接收()的包裝函數

回答

0

的問題是pthread_create通話和你傳遞參數有:

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

在這裏,你不要」不傳遞指向TCPStream對象的指針(即TCPStream*),而是指向指向TCPStream對象(即TCPSTream**)的指針。

這會導致未定義的行爲在您的線程函數中,因爲您將指針視爲指向TCPStream的指針。

調用pthread_create時,只需放下操作員地址&,它應該開始工作。

+0

是的,我在pthread_create函數的第四個參數中刪除'&'。現在罰款 – user2357643

+0

您還需要刪除演員。如果你沒有用void * cast關閉編譯器,你會看到編譯錯誤,而不是神祕的行爲。 – SergeyA