初学CAsyncSocket,我试Send了一个包,然后立刻调用了Receive函数等待服务器反应数据,结果什么数据都没有收到,后来我在Send与Receive中加了一个Sleep(1000)就可以收到返回数据了,所以有些困惑1.Receive是不是读取一个类似于队列数据结构,就是如果我过一段时间不调用,但是已经有很多数据包发进来了,我再调一下,Receive到的是最先进来的一个包还是,全部我没有读取的包一下子进我的变量,还是什么其他情况?2.如果要弄成同步的,是否是要写一个类继承于CAsyncSocket然后重载他的OnReceive函数?3.一般与服务器交流是用怎么一种开发模式?因为Send后不是立即Receive到数据,所以Send后直接Receive不可行顺便再问一个网络问题:用TCP 3次握手后如果我不和服务发送其他数据,是立即会断开呢,还是要等一段时间,大概要等多久?问题比较多,回答的都有分,麻烦各位了,谢谢
1.那么收进来的数据就是都已经先放在一个缓存里了,然后就等我用Receive来收了对吗?这个缓存有多大呀?
2.那就是要我弄一个CAsyncSocket的继承重载OnReceive对吗?
Sendxxxx()
{
AsyncSelect(FD_WRITE | FD_CLOSE);
}OnSend()
{
Send();
AsyncSelect(FD_READ | FD_CLOSE);
}
接收
OnReceive()
{
Receive();
AsyncSelect(FD_READ | FD_CLOSE);
CAsyncSocket::OnReceive(nErrorCode);
}
用 CAsyncSocket 就应该重载 OnConnect, OnClose, OnSend, OnReceive
好象设置 KEEP_ALIVE 也不行。
virtual void OnReceive(int nErrorCode);.cpp
void CClientSocket::OnReceive(int nErrorCode)
{
}
CSocket是阻塞方式的。调用Receive后他会一直等待直到有数据过来才返回。如果你用CAsyncSocket的话,建议设一个循环,反复读取,如无数据continue继续。如有则处理!另外TCP连接后,不和服务发送其他数据不是立即会断开。它会一直连接的。据体多长时间可能会断开我也没试过。
TCP建立连接后,会有一个超时定时器,2MSL等时间发生状态转移