作者neigence ()
站內C_and_CPP
標題[心得] CAsynSocket 使用心得和討論
時間Tue Nov 10 17:14:56 2009
首先 我寫的是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