双方均为MFC CSOCKET的派生类,客户端发送数据,无论是10个字节也好,20个字节也好,服务器端总是4个字节一收.比如说如果我发20个字节,那它就OnReceive五次.我用sniffer看过,发确实在一个数据包里发的.只可能是收出了问题,而接收用的缓冲区足够大.
我的每个数据包分两部分,前12个字节是自定义头部,中间有个字段指明了后面数据的长度.现在出现了上面的问题,我没法一次收完,但也不知道该怎么收.如果发的是正确的包,那我还可以先收头部(12字节),然后根据头部得到后面数据长度,再接收.但如果故意发个错误的包,就阻塞在那里了.
我试过用setsockopt设定接收缓冲区,但还是一次最多收4个字节;想把套接字设定成异步,用asyncselect将套接字设定成异步,用ioctl设FIONREAD,用setsockopt设SO_RCVTIMEO,函数都成功返回,但没有数据的时候仍然是阻塞在那里.我实在没有办法了.
现在程序的结构就这样了,不大可能不用CSOCKET的派生类.还有的救吗?
我的每个数据包分两部分,前12个字节是自定义头部,中间有个字段指明了后面数据的长度.现在出现了上面的问题,我没法一次收完,但也不知道该怎么收.如果发的是正确的包,那我还可以先收头部(12字节),然后根据头部得到后面数据长度,再接收.但如果故意发个错误的包,就阻塞在那里了.
我试过用setsockopt设定接收缓冲区,但还是一次最多收4个字节;想把套接字设定成异步,用asyncselect将套接字设定成异步,用ioctl设FIONREAD,用setsockopt设SO_RCVTIMEO,函数都成功返回,但没有数据的时候仍然是阻塞在那里.我实在没有办法了.
现在程序的结构就这样了,不大可能不用CSOCKET的派生类.还有的救吗?
解决方案 »
- 有关动态链接库的问题
- 我的GDI+操作很规范,为什么操作起来没有效果?(见内)
- 求关于页脚设计的代码
- 菜鸟关于vc内存问题求救!
- 如何取得CImageList中的BMP图象
- 我现在身居重庆,很想到你们那边去发展,我在一家ERP公司里用JSP做过医药管理系统和餐饮管理系统,和图书管理系统,工作有两年多了,也曾
- 如何在用户选择不同的扩展名类型时,我的另存对话框中输入文件名的地方可以自动变换文件名
- 怎样动态的给我的图标上面画一自己的小图画
- 原来看mfc源码真的那么重要,原来mfc书上看得半懂不懂得话和意思,一看源码全都明白了。哈哈,高兴再散分!!!
- 找别扭的两不同位图怎么处理。非常感谢!
- [急] vc6的安装问题 xp sp2下setup.exe运行出错 如何解决?
- 简单的问题,在线等??
你说的不可能是不可能收4个字节,还是不可能改不成非阻塞?
如果是类似char* pRcvBuf = new char[BUF_SIZE]这样,则sizeof(pRcvBuf)==4。
那阻塞非阻塞呢?从CSOCKET继承下来的能改成非阻塞吗?怎么改?