2016-11-15 108 views
-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); 
} 

原始输出:
读取之前
后读取

新成果:
前阅读

+1

这完全破碎了。如果同时收到两个连接,您会怎么看?只有一个'sock'全局变量。你认为'out'指向哪里,GetRequest'会写入?你需要学习如何使用调试器。 –

+0

@SamVarshavchik我只包含与错误相关的代码片段。 out和GetRequest正在写回到main。如果需要,我可以上传其他代码。 – sauzke

+0

如果你不知道你的bug在哪里,那么你不知道这些“片段”是否相关。 C++并不那么简单。仅仅因为某个程序崩溃或无法在某个特定的地方工作并不意味着这就是错误所在。根据显示的代码唯一可以确定的是在所示的代码中存在多个基本的错误。 –

回答

1

这被打破:

if ((rval = read(msgsock, buf, 1024)) < 0){ 
    perror("reading socket"); 
}else{ 
    strcpy(out,buf); 

你忽略rval,除非它发出错误信号。它应该是:

if ((rval = read(msgsock, buf, 1024)) < 0){ 
    perror("reading socket"); 
else if (rval == 0) { 
    // peer closed the connection 
    close(msgsock); // or closesocket(), depending on your platform 
    break; 
}else{ 
    strncpy(out,buf,rval); 

,这也断了:

sock = ss->Accept();  
pthread_create(&thread, NULL, SocketThread, &(*ss)); 

线程开始处理客户端在侦听套接字没有兴趣。它需要的是接受套接字sock,它需要以这样的方式得到它,它不会在下次调用时被覆盖。通常,sock是接受循环中的局部变量,并通过pthread_create()传递。

相关问题