如何使发送和接收方法同时工作?

Posted

技术标签:

【中文标题】如何使发送和接收方法同时工作?【英文标题】:How to make send and recv methods work simultaneously? 【发布时间】:2016-02-19 12:46:18 【问题描述】:

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);

【问题讨论】:

正确的缩进很重要,请修复你的。 发布所有您的代码。比如recv_data是什么? 服务器:pastebin.com/dMtwiiuP 客户端:pastebin.com/yPm3kN25 如果你想同时服务 N 个客户端,你最好启动 N 个线程。一个阅读线程和一个写作线程没有多大意义。 @n.m.,你为什么这么说?这根本不是真的。 【参考方案1】:

当您发送“Q”或“q”时,您似乎正在关闭接受的套接字。如果您在同一进程中同时运行客户端和服务器时对此进行测试,如果您执行close( socket ),则可能不会返回阻塞recv。请参阅Blocking recv doesn't exit when closing socket from another thread? 那里的答案建议您可以在close 之前致电shutdown。另一种选择是将recv 更改为非阻塞并阻塞select,因为这样可以更好地控制线程等待的条件。

另一方面,如果“Q”或“q”是由运行在不同进程中的客户端发送的,那么只要字符串比较成功,您的代码“应该”工作。但是,在处理 TCP 套接字时,始终建议优雅地关闭它们。请参阅Properly close a TCP socket 执行shutdown 并在执行close 之前处理套接字远程端的后续读取失败/fin 是建议的方法。

【讨论】:

您能否从这些来源添加更多详细信息?

以上是关于如何使发送和接收方法同时工作?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中同时使用 Datagramsocket 发送和接收 - 只是发送?

Python Socket - 同时发送/接收消息

如何同时从 python 发送和接收数据到 arduino

winsock 服务器同时发送和接收

Python 套接字中的发送和接收是如何工作的?

同时发送/接收消息套接字python