【发布时间】:2016-11-15 03:05:54
【问题描述】:
我想创建一个多线程套接字服务器。我的服务器工作正常,但是当我尝试将我的代码移动到工作函数中时,服务器在读取客户端数据时停止工作。
原代码: 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 我只包含了与错误相关的代码的 sn-ps。 out 和 GetRequest 正在写回 main。如果需要,我可以上传其他代码。
-
如果你不知道你的错误在哪里,那么你就不知道这些“sn-ps”是否相关。 C++ 没那么简单。仅仅因为程序在某个特定位置崩溃或无法运行并不意味着这就是错误所在。根据显示的代码唯一可以确定的是显示的代码中存在多个基本错误。
-
@SamVarshavchik 我发现了问题所在。看来我需要指定 out 的大小。谢谢提醒。
标签: c++ multithreading sockets