-2
我想创建一个多线程套接字服务器。我有服务器工作正常,但是当我尝试将我的代码移入辅助函数时,服务器在读取客户端数据时停止工作。C++多线程套接字无法接收客户端数据
原始代码: main.cpp中
int sock;
main(){
SocketServer *ss = new SocketServer(8888);
pthread_t thread;
if(ss != NULL){
while(true){
sock = ss->Accept();
char* out;
ss->GetRequest(sock, out);
}
}
}
SocketServer.cpp
void SocketServer::GetRequest(int msgsock, char* out){
char buf[1024];
int rval;
std::cout<<"before read\n";
if ((rval = read(msgsock, buf, 1024)) < 0){
perror("reading socket");
}else{
strcpy(out,buf);
}
std::cout<<"after read\n";
}
添加线程之后: main.cpp中
int sock;
main(){
SocketServer *ss = new SocketServer(8888);
pthread_t thread;
if(ss != NULL){
while(true){
sock = ss->Accept();
pthread_create(&thread, NULL, SocketThread, &(*ss));
pthread_detach(thread);
}
}
}
static void* SocketThread(void* lp){
SocketServer *ss = (SocketServer*) lp;
char* out;
ss->GetRequest(sock, out);
}
原始输出:
读取之前
后读取
新成果:
前阅读
这完全破碎了。如果同时收到两个连接,您会怎么看?只有一个'sock'全局变量。你认为'out'指向哪里,GetRequest'会写入?你需要学习如何使用调试器。 –
@SamVarshavchik我只包含与错误相关的代码片段。 out和GetRequest正在写回到main。如果需要,我可以上传其他代码。 – sauzke
如果你不知道你的bug在哪里,那么你不知道这些“片段”是否相关。 C++并不那么简单。仅仅因为某个程序崩溃或无法在某个特定的地方工作并不意味着这就是错误所在。根据显示的代码唯一可以确定的是在所示的代码中存在多个基本的错误。 –