如何使发送和接收方法同时工作
How to make send and recv methods work simultaneously?
发送和 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 在从另一个线程关闭套接字时不退出?那里的答案表明您可以在close
之前致电shutdown
。另一种选择是将recv
更改为非阻塞并改为在select
上阻塞,因为这可以让您更好地控制线程等待的条件。
另一方面,如果"Q"或"q"是由在不同进程中运行的客户端发送的,则只要字符串比较成功,您的代码"应该"就可以工作。但是,在处理 TCP 套接字时,始终建议优雅地关闭它们。请参阅正确关闭 TCP 套接字 在执行close
之前,执行shutdown
并处理套接字远程端的后续读取失败/fin。
相关文章:
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- std::bind,无法让具有单个参数的方法工作
- 私有变量无法正常工作的C++getter方法(只有Java经验)
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 让类与运算符一起工作更简单的方法
- 找不到使保证返回值优化工作的方法
- C++ set_difference方法未按预期工作
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- C 方法无法工作
- 我是否应该在构造函数或成员方法中进行大量初始化工作
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 这种奇怪的 I/O 方法是如何工作的?
- 在 Xcode 中工作的 CMake 中启用地址清理器的正确方法是什么
- 在Qt中使用工作线程将数据写入文件的正确方法是什么?
- 我试着了解方法覆盖是如何工作的,不知道为什么输出 2
- 我的重载后增量方法无法按预期工作。为什么?
- 无法使方法存在检测机制正常工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?