2012-01-11 98 views
1

我在C++寫了這個類的多線程TCP服務器TCP服務器..和::多線程在C++

g++ -o server server.cpp -lpthread 

編譯,但我得到以下錯誤::

invalid conversion from "void*" to "void* (*)(void*)" 
initializing argument 3 of "int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)" 

什麼我應該怎麼做?我的代碼::

#include "PracticalSocket.h" 
#include <iostream>   
#include <cstdlib>   
#include <pthread.h>   
using namespace std; 

class MultiThreadedServer{ 

private: 
static const int RCVBUFSIZE = 1024; 
string agent_ip; 
int agent_port; 

public: 

string startServer(unsigned short port, string agentIP, int agentPort) 
{ 
agent_ip = agentIP; 
agent_port=agentPort; 

try 
{ 
    TCPServerSocket servSock(port); // Socket descriptor for server 

    for (;;) 
    { 
     // Create separate memory for client argument 
     TCPSocket *clntSock = servSock.accept(); 
     pthread_t threadID;    
     if (pthread_create(&threadID, NULL, (void*) &ThreadMain,(void *) &clntSock) != 0) 
     { 
      cerr << "Unable to create thread" << endl; 
      exit(1); 
     } 

    } 
} 
catch (SocketException &e) 
{ 
    cerr << e.what() << endl; 
    exit(1); 
} 
// NOT REACHED 
} 


// TCP client handling function 
void static HandleTCPClient(TCPSocket *sock) 
{ 
cout << "Handling client "; 
try 
{ 
    cout<<"Foreign address: "<< sock->getForeignAddress() << ":"; 
} 
catch (SocketException &e) 
{ 
    cerr << "Unable to get foreign address" << endl; 
} 
try 
{ 
    cout<<"Foreign port: "<< sock->getForeignPort(); 
} 
catch (SocketException &e) 
{ 
    cerr << "Unable to get foreign port" << endl; 
} 
cout << " with thread " << pthread_self() << endl; 

char echoBuffer[RCVBUFSIZE]; 
int recvMsgSize; 
while ((recvMsgSize = sock->recv(echoBuffer, RCVBUFSIZE)) > 0) 
{ 
    cout<<"echoBuffer::::"<<echoBuffer; 
    //sock->send(echoBuffer, recvMsgSize); 
} 
    // Destructor closes socket 
} 

static void ThreadMain(void *clntSock) 
{ 
// Guarantees that thread resources are deallocated upon return 
pthread_detach(pthread_self()); 

// Extract socket file descriptor from argument 
HandleTCPClient((TCPSocket *) clntSock); 

delete (TCPSocket *) clntSock; 
//return NULL; 
} 



}; 
+1

WHE噸他投?只要說'ThreadMain',或者'MultiThreadedServer :: ThreadMain'。 – 2012-01-11 15:23:24

+0

當編譯和鏈接代替'-lpthread'時使用'-pthread',後者是不夠的。 – 2012-01-11 17:34:14

回答

1

您只需直接使用方法名無投:

pthread_create(&threadID, NULL, ThreadMain,(void *) &clntSock) 

另外的方法需要返回void*void

static void* ThreadMain(void *clntSock) 
+0

謝謝,但...我得到這個錯誤,編譯後不能創建目標文件::: /usr/lib/gcc/i586-redhat-linux/4.4.1/../../../crt1的.o:在功能'_start ': (+的.text爲0x18):未定義的引用'主' collect2:LD返回1個退出狀態 – Ronin 2012-01-11 15:46:17

+0

你不需要殘留'(無效*)'投無論是。 – 2012-01-11 16:17:42

+0

@RRR:這意味着您的文件中沒有主要方法。 – Tudor 2012-01-11 17:02:20

1

這是錯誤的:

pthread_create(&threadID, NULL, (void*) &ThreadMain,(void *) &clntSock) 

在pthread_create預計正確簽名的函數指針(ThreadMain)。

pthread_create(&threadID, NULL, MyThreadedServer::ThreadMain, (void *) &clntSock) 

這應該夠了。

編輯:在他的回答中指出鐸,在ThreadMain函數的返回類型必須是void *:

void* ThreadMain(void* d); 
+0

此外,正如我注意到..除非此代碼僅用於教育目的,我建議您檢查boost.asio更容易,跨平臺的多線程應用程序(尤其是服務器):http://www.boost。 org/doc/libs/1_48_0/doc/html/boost_asio/tutorial/tutdaytime3.html – 2012-01-11 15:29:05

+1

@RRR:同樣的方法應該返回void *,正如我在我的答案中所說的。 – Tudor 2012-01-11 15:33:10

+0

你的編譯命令看起來很好。看看我的舊線程包裝的實現:http://code.google.com/p/craplib/source/browse/trunk/Thread.cpp – 2012-01-11 15:34:49