c++多线程套接字无法接收客户端数据

C++ multithread socket cannot receive client data

本文关键字:客户端 数据 多线程 套接字 c++      更新时间:2023-10-16

我想创建一个多线程套接字服务器。我有服务器工作得很好,但是当我试图将我的代码移动到工作函数时,服务器在读取客户端数据时停止工作。

原始代码: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 readn";
    if ((rval = read(msgsock, buf, 1024)) < 0){
        perror("reading socket");
    }else{
        strcpy(out,buf);
    }
    std::cout<<"after readn";   
}

添加线程后: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);
}

原始输出:之前读过
后读


新输出:之前读过

这是打破:

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是accept循环中的局部变量,并通过pthread_create()传递。