首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

采用重叠I/O模式之事件通知中遇到的有关问题

2014-07-05 
采用重叠I/O模式之事件通知中遇到的问题?我采用的是重叠I/O模式之事件通知编程;现在有这样一个问题:当客户

采用重叠I/O模式之事件通知中遇到的问题?
我采用的是重叠I/O模式之事件通知编程;现在有这样一个问题:当客户端传递字符串给服务器的时候,函数WSAGetOverlappedResult()是否一次获得到字符串长度值,也就是说该函数的参数lpcbTransfer是否一次性获得字符串的长度值;函数WSARecv()是否一次性获得字符串,如果WSARecv没有一次获得字符串,那么如何处理才能不会让服务器端多次接收完客户端发送的字符串;
例如客户端发送字符串:abcdefg;函数WSAGetOverlappedResult()中的参数lpcbTransfer的值是否是7(或者分两次:一次是5,一次是2)?,函数WSARecv()可能一次接收到abcdefg(或者分两次接收,一次接收到abcde,再一次接收到fg?
[解决办法]
先用缓存接受字符串,判断是否接受完整。不完整就重复接受,当然要设偏移地址。
例:


        int nReadCount = 0;
int nOffset = m_nRecvBytes;
int nBuffSize = (int)sizeof(m_dataBuffer) - nOffset;
char *szDataBuff = m_dataBuffer + nOffset;
nReadCount = recv(m_hSocket, szDataBuff, nBuffSize, 0);

接受完了,清除缓存,m_nRecvBytes置零
[解决办法]
引用:
Quote: 引用:

这不是很正常?  多次显示的内容加起来不就是客户端发的? 你自己不定义协议封包  当然就是这个结果

好比你发100个快递 一起发的  收的人不是一件件收最后收完100个快递?  你的数据越多网络越差 你一次收不

完的情况就越多... 

对,就是你说的这种情况,那么服务器端如何处理? 


不是说了 要自己定协议自己封包么? 你客户端每次发送字符串前先发送一个int表示接下来发送的字符串多长
比方你发送123456 你int len=6 先发送len再发送“123456”  服务器先收4字节的int 收到len==6 再收6字节的字符串  然后再显示“123456”  

热点排行