繁体   English   中英

如何使send和recv方法同时工作?

[英]How to make send and recv methods work simultaneously?

Send和recv方法工作正常,但是当我退出时,recv方法保持循环。 我对多线程了解不多。 当我发送“ Q”时,连接应正确关闭,并且必须监听客户端。

如何同时为多个客户提供服务?

int main()
{
    if (listen(sock, 5) == -1) {
        cerr<<"unable to listen for clients"<<endl;
        exit(1);
    }

    cout<<"TCPServer Waiting for client on port 8000"<<endl;
    sin_size = sizeof(struct sockaddr_in);

    connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
    thread sds(snds),rvs(rcvs);
    if(sds.joinable()){
        sds.join();
    }
    if(rvs.joinable()){
        rvs.join();
    }
    close(sock);
    return 0;
}

void rcvs(){
    while(1){
        bytes_received = recv(connected,recv_data,1024,0);
        recv_data[bytes_received] = '';
        srz_rcv=recv_data;
        mb.ParseFromString(srz_rcv);
        srz_rcv=mb.msg();
        if (strcmp(srz_rcv.c_str() , "q") == 0 || strcmp(srz_rcv.c_str() , "Q") == 0){
            goto FINISH;
        }
        else{
            cout<<inet_ntoa(client_addr.sin_addr)<<" : "<<srz_rcv<<endl;
        }
        mb.Clear();
    }
    FINISH:
    close(connected);
    exit(0);
}
void snds(){
    while(1){
        cout<<"sent : ";
        cin>>send_data;
        mb.set_msg(send_data);
        mb.SerializeToString(&srz_snd);
        if (strcmp(srz_snd.c_str() , "q") == 0 || strcmp(srz_snd.c_str() , "Q") == 0){
            send(connected, srz_snd.c_str(),1024, 0);
            goto FINISH;
        }
        else{
            send(connected, srz_snd.c_str(),mb.ByteSize(), 0);
        }
        mb.Clear();
    }
    FINISH:
    close(connected);
    exit(0);
}

发送“ Q”或“ q”时,您似乎正在关闭接受的套接字。 如果在同一进程中同时运行客户端和服务器时进行测试,则执行close( socket )可能不会返回阻塞recv 请参阅从另一个线程关闭套接字时,退出recv不会退出吗? 这些问题的答案有建议你可以调用shutdownclose 另一个选择是将recv更改为non-blocking,然后在select阻塞,因为这样可以使您更好地控制线程的等待条件。

另一方面,如果“ Q”或“ q”是由运行在不同进程中的客户端发送的,则只要字符串比较成功,您的代码“应该”就可以工作。 但是,在处理TCP套接字时,始终建议适当地关闭它们。 看看正确关闭TCP套接字做一个shutdown和做一个前处理在插座的远端随后的读取失败/翅片close是所提出的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM