怪!一个关于WinSocket API的问题,请指点迷津? tigerjade说的很对,socket的默认缓冲区大小有限, 所以你一次收不完,如果你不想循环接受的话,用setsockopt把缓冲区设大一些。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 范例:设置接受缓冲区大小 int nconst = 0x20000;//128k nret = ::setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char *)&nconst, sizeof(nconst)); 我觉得原因可能是多种多样的,因为在TCP打成IP包之后,会被拆开,因此一个比较大的TCP包会被拆成多个小的IP包,这样,每收到一个IP包就会读取产生一条OnReceive消息(具体消息是什么名字我忘了,暂时这么说吧),这时如果你只是读一次的话很可能数据不能一次收下来。我的意见是:在你的类里面专门定义一个变量,其中设置需要读取的字节数,每收到一次OnReceive消息,就把从中减去所收到的字符数。直到这个变量最后变为0,才表示所有需要收到的数据都收全了,这时才能进行下面的操作,否则只能继续等待OnReceive消息。你可以试试看,应当不是很复杂。 MFC中MSCOMM控件的接收发送问题 关于udp服务端的问题,求指点啊? socket编程,客户端向服务器传递的数据类型的问题 键盘钩子中WM_CHAR为什么执行两次 难 图形交互问题 求源代码 将“前进”、“后退”、“向上一级”三个命令添加到资源管理器的右键菜单?百分求教! 计算机等级证书在网上怎么查真伪呀?我很急~斑竹不要删啊~我知道这个版块人气很旺~ 初次学用多线程,但是运行不了 一直以来我都有个关于WinNT/2000/XP的注册表文件的疑问 ~ ActiveX的正常显示 请求帮帮忙!
int nconst = 0x20000;//128k
nret = ::setsockopt(s,
SOL_SOCKET,
SO_RCVBUF,
(const char *)&nconst,
sizeof(nconst));
我的意见是:
在你的类里面专门定义一个变量,其中设置需要读取的字节数,每收到一次OnReceive消息,就把从中减去所收到的字符数。直到这个变量最后变为0,才表示所有需要收到的数据都收全了,这时才能进行下面的操作,否则只能继续等待OnReceive消息。
你可以试试看,应当不是很复杂。