SOCKET编程,接收数据不完整?
我用recv()接收数据,可是总是不完整,而如果我在前面加入Sleep(500)就没有问题了,请问这是怎么回事?有没有更好的解决办法? 问题点数:100、回复次数:6Top
1 楼vc_boy()回复于 2002-06-14 08:59:11 得分 0
自定义数据包结构,在每个包的结尾放上一个标志。在接收时对此标志进行检查,如果没有此标志就再接收。Top
2 楼atling()回复于 2002-06-14 09:00:33 得分 30
tcp是流方式的,recv()返回接收到的字符数,你检查不够就再接收一次。Top
3 楼yangyb1120(Monkey)回复于 2002-06-14 09:00:43 得分 10
数据还没准备好,你能接受什么?你可以用一个循环看数据准备好了没有Top
4 楼slimak(破肚虫)回复于 2002-06-14 09:11:51 得分 30
这是你的逻辑流程没有处理对
你可以用Event(事件)+计算Byte来确保数据的接受
typedef struct{
DWORD dwDataLength; //告诉接受方接下来要发过来的数据大小
TCHAR szSynaMark[8]; //同步标志
...
}_PACKET1;
把第一个数据包发过去然后等待对方确认收到了第一个数据包
然后分多次或一次发要传输的数据包
typedef struct{
DWORD dwDataLength; //告诉接受方本次发过来的数据大小
TCHAR szSynaMark[8]; //同步标志
...
TCHAR szData[DATA_SIZE]; //数据
}_PACKET2
接受的时候用dwDataLength来判断是否收完,如果数据很大
那么收到一定程度就可以用一个线程去处理收到的数据.
Top
5 楼taianmonkey()回复于 2002-06-14 09:16:32 得分 0
我所遇到的客观因素:
所用的5类线是非屏蔽的!
换线后就没什么事了!
不过那是有的数据接收不到!Top
6 楼alidiedie(阿里)回复于 2002-06-14 11:10:48 得分 30
试试WasyncSelectEVENT,在这个函数中可以指定自己感兴趣的下一事件,可以指定FD_READ.并自定义消息响应函数.这样当缓冲区中有数据就回通知你,直到没数据.
#defin wm_myread wm_user+101//自定义消息
afx_msg lresult onmyread(wparam,lparam);//自定义消息响应函数
on_message(wm_myread,onmyread);//自己插入消息映射
//连接成功后,调用
wsaynseletnextevent(hwnd,wm_myread,0,0,fd_read);
afx_msg lresult onmyread(wparam,lparam)
{读取数据
}
Top




