c++ 中的 tcp 服务器中的多线程
我已经用 C++ 为多线程 tcp 服务器编写了这个类 .. 并通过 :: 进行编译
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;
}
};
I have written this class for Multithreaded tcp server in C++ .. and compile by ::
g++ -o server server.cpp -lpthread
BUT I get the following errors ::
invalid conversion from "void*" to "void* (*)(void*)"
initializing argument 3 of "int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)"
What should I do ?? My Code ::
#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;
}
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以直接使用方法名称而不进行强制转换:
此外,该方法需要返回
void*
而不是void
:You can just use the method name directly without a cast:
Also the method needs to return
void*
notvoid
:这是错误的:
pthread_create 需要一个指向正确签名的函数(ThreadMain)的指针。
这应该足够了。
编辑:正如 Tudor 在他的回答中指出的那样,ThreadMain 函数的返回类型必须是 void*:
This is wrong:
pthread_create expects a pointer to function (ThreadMain) of the correct signature.
This should be enough.
EDIT: as pointed out by Tudor in his answer, the return type of the ThreadMain function must be void*: