看板 C_and_CPP 關於我們 聯絡資訊
首先 我寫的是client 端 class MySocket : public CAsynSocket{ public: MySocket(); void OnSend(int errorCode); void OnReceive(int errorCode); void OnConnect(int errorCode); } //某個地方會宣告一個mySocket MySocket mySocket; 我先隨意定一個MySocket 來繼承 CAsynSocket 先不管建立的過程為如何 一開始我使用它就只是 1 我想送命令時 我直接呼叫mySocket.Send( ... ); 2 而當server有訊息送過來被收到時 系統會呼叫我的OnReceive( ) 我在裡面呼叫Receive就可以 後來 …… 我發現 如果 假如你有一個迴圈 for(int i=0;i<10000;i++) mySocket.Send( somemessage); 這樣快速連送時 會導致錯誤,我猜應該是由於他是asyn的 不能送太快 所以 我改進我的做法 class MySocket : public CAsynSocket{ public: MySocket(); void OnSend(int errorCode){ if(buffer!=""){ this->Send(buffer.GetBuffer(),buffer.GetLength()); buffer=""; } this->AsyncSelect(FD_READ); //---------(1)------------ } void OnReceive(int errorCode){ //here you can call Receive to recevie msg from server } void OnConnect(int errorCode); //外人不能直接呼叫Send,必須呼叫 這個函式 void sendMsgToServer(CString msg){ buffer+=msg; this->AsynSelect(FD_WRITE); //-----(2)------------ } protected: CString buffer; } 改進成這樣後 就算快速發送 也不會發生前面描述的問題 必竟是把string 加起來到buffer當中一次發送 有(2) 系統才會幫你呼叫OnSend() 有(1) 系統才會幫你呼叫OnReceive() 不過 其實這邊我並不太懂 我嘗試在建構子當中加入 this->AsyncSelect(FD_READ | FD_WRITE) 但似乎沒用 必須要每次送訊息後 都要AsyncSelect一下 ~"~ 請問 這種用法 還算正確嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.237.63
WPC001:其實你應該妥善利用CArchive... CSocket是很高階的... 11/10 22:43
WPC001:已經幫你包了這麼多... 就要盡量使用高階的部分 11/10 22:43