作者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
1F:→ WPC001:其实你应该妥善利用CArchive... CSocket是很高阶的... 11/10 22:43
2F:→ WPC001:已经帮你包了这麽多... 就要尽量使用高阶的部分 11/10 22:43