Re: [問題] socket接受multi client的問題

作者: hn12404988 (Willy)   2016-12-16 19:10:41
: 以上是server片段程式
: 我想實作一個就是可以接受多個client的socket
: 以上的code可以做到接收多個client但無法同時執行pthread_create
: 就是說當我第一個client連線到server時,正執行pthread的thread_function時
: 當有其他client連入,必須等到pthread結束..等下個accept後才能執行
: 但我想做到的是
: 當第一個client連線執行時,這時有另一個client連入後可以馬上接受accept並執行
: pthread的thread_function
: 不知道要如何修改才能達到?
================== 這個是子thread的執行部份 =============================
auto execute = [&](short int index){
std::string str;
while(server.msg_to_args(index)==true){
}
//client斷線,子thread自動回收
};
==================== 這個是主thread的接收連線部份 ======================
template<class F>
void socket_server::start_accept(F fn){
while(new_socket = accept4(host_socket, (struct sockaddr *)&client_addr,
&client_addr_size,SOCK_NONBLOCK)){
recycle();
if(new_socket>0){
get_index();
busy_list[i] = true;
thread_list[i] = new std::thread(fn,i);
}
}
recycle();
}
這是我的multi-thread socket程式中的部份,以上兩個段落都貼你應該會比較好了解
邏輯是:
1. 主thread只負責接收連線,收訊息是每個子thread自己的事
2. 子thread是一個lambda function,帶一個index是表明自己是第幾號子thread
3. 子thread的lambda直接宣告在global scope,像以下這樣
#include <socket_server.h>
auto execute = [&](){};
socket_server server;
//server不一定要放在global,我是有我自己的需求才這樣
int main(){
server.start_accept(execute);
//server crash
return 0;
}
你應該只要注意accept4那行的寫法,應該就可以解決你的問題
但如果你也想用lambda來執行子thread,就可以參考我的作法
lambda的好處是可以pass by reference, 因為我的子thread與主thread有共用東西
最後,用std::thread而不用pthread是因為,std::thread有支援lambda寫法
pthread我的編譯器編不過,這部份你可以在自己試試看

Links booklink

Contact Us: admin [ a t ] ucptt.com