發送和recv方法工作正常,但當我發送退出recv方法保持循環。我不太瞭解多線程。當我發送'Q'時,連接應該正常關閉,並且必須監聽客戶端。如何使send和recv方法同時工作?
如何同時爲多個客戶端提供服務?
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);
}
正確的縮進問題,請修復你的問題。 – Borgleader
發佈**所有**的代碼。例如,什麼是'recv_data'? –
服務器:http://pastebin.com/dMtwiiuP客戶端:http://pastebin.com/yPm3kN25 – jsr