请问TCustomSocket::OnRead事件在何条件下触发?
例如:建立连接传输数据,一方接收数据,
当接收方该事件触发时读取数据,
问题是该事件何时触发?是传送到一个字节后就马上触发
还是全部传送完毕数据接收方才出发该事件,
本人菜鸟一个,不要见笑,
谢谢!
本人用C++Builder,因在C++Builder论坛无人回答,
所以希望大家鼎立相助。
例如:建立连接传输数据,一方接收数据,
当接收方该事件触发时读取数据,
问题是该事件何时触发?是传送到一个字节后就马上触发
还是全部传送完毕数据接收方才出发该事件,
本人菜鸟一个,不要见笑,
谢谢!
本人用C++Builder,因在C++Builder论坛无人回答,
所以希望大家鼎立相助。
如果缓冲区里面有数据的话就调用void CClientSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the
//base class char buffer[1024]; if(nErrorCode == 0)
{
memset(buffer, '\0', sizeof(buffer)); this->Receive(buffer, sizeof(buffer), 0); AfxMessageBox(buffer, MB_OK);
}
CSocket::OnReceive(nErrorCode);
}我的实验:
我发了1370个 char,在调试中,第一次调用OnReceive后,进入函数体,在下面循环了一次if(nErrorCode == 0)
{
memset(buffer, '\0', sizeof(buffer)); //该语句执行两次 this->Receive(buffer, sizeof(buffer), 0); //该语句执行两次 AfxMessageBox(buffer, MB_OK); //该语句执行一次
} 最后的message box里面显示的是 (1370-1024)个 char很奇妙的过程,我也是一直对这些函数什么时候被调用很迷茫,也看很多的资料,但我发现,调式程序的收获是最大的。
这句执行一次,而上面两句执行了两次,有点奇怪了我想可能是this->Receive(buffer, sizeof(buffer), 0)这句执行了
后,buffer区立即又有了后面来的数据,有触发了OnReceive()所以上面执行了两次,最后一句是一次。你可以在做个实验,发送5000长度的,我想上面俩句可能是5次,最后
一句还是一次呢,哈哈当然不一定了,因为socket本身有个buffer,可能不到5000长度了
所以未必是五次了,哈哈不过作这样的测试后,就能知道socket本身的buffer大小了,good idea::)
例如我这里发送10M的数据,当对方接收
事件被触发时对方收到1K数据,那接收完所有数据
对方要触发多少次OnRead事件啊!那对方怎么知道我传送完了呢?
那编程多不方便啊!我想肯定不是我想的那样,
可就是不明白,能否给一个更清楚的答案,谢谢!
我想可能是this->Receive(buffer, sizeof(buffer), 0)这句执行了
后,buffer区立即又有了后面来的数据,有触发了OnReceive()
************************************************************接受缓冲大于 1370 char所以可以一次接受到这么多 charreceive一次,移走 1024 char 还有1370 - 1024 在缓冲中,所以要第二次 receive 啊********************************************************************你可以在做个实验,发送5000长度的,我想上面俩句可能是5次,最后
一句还是一次呢,哈哈当然不一定了,因为socket本身有个buffer,可能不到5000长度了
所以未必是五次了,哈哈
********************************************************************接受缓冲是有限制的,不是想当然是多少就上多少,我记得是 8*1024
那编程多不方便啊!我想肯定不是我想的那样,
********************************************************************你要传文件,先传文件的大小,client就知道应该接受多少了啊等到receive够了,就向server发送消息说 收到了
谢了,有点明白了,
还要看书,这方面我没经验。
你太谦虚了,一起进步!
2.显然这个函数是在系统检测到你的Sockect的接受缓冲区有新数后自动调用。
3.你在发送端不发送数据,它自然不会再调OnRead,而不是说你发什么命令告诉它。当然你可以销毁它。
4.要判断接受的数据是否到了结尾,这需要你自己定义一个数据的尾帧符号,比如:连续收到5个0x88就表示结束。
5.10M的数据量是算不得什么的,我在做视频会议的时候,视频加音频的数据最高时站的带宽为3.2M/秒。所以你不必为系统的处理速度担忧。
最后,赶紧给分。不然不理你了。呵呵。
还是全部传送完毕数据接收方才出发该事件,
//我认为。只要一收到就触发onreceive,收到多少看receive的参数和返回值。
client onreceive 中设断点调试时在server onsend中调用send后,马上,client中的onreceive就被触发了