2012-01-11 101 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