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

看板C_and_CPP作者 (Willy)時間8年前發表 (2016/12/16 11:10), 8年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
: 以上是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我的編譯器編不過,這部份你可以在自己試試看 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.16.181 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1481886644.A.339.html ※ 編輯: hn12404988 (220.133.16.181), 12/16/2016 19:12:21
文章代碼(AID): #1OKykqCv (C_and_CPP)
文章代碼(AID): #1OKykqCv (C_and_CPP)