CSOCKET接收数据问题:一发多收和阻塞非阻塞等问题如何解决
双方均为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的派生类.还有的救吗?
...全文
相关推荐
Socket C++ TCP阻塞\非阻塞 服务器 客户端 开发
一个很详细的文档,基于c++ winsocket的非阻塞服务器开发
MFC实现非阻塞Socket通信
使用MFC实现非阻塞套接字通信,可以多个客户端和一个服务器任意通信,通信协议采用protobuf,代码可直接运行exe文件,平台为vs2013。
IO模型中的阻塞模型和非阻塞模型
就是自己总结的小知识点 为什么还要写50个字来描述它,够了
MFC疑难注解:CAsyncSocket及CSocket
MFC疑难注解:CAsyncSocket及CSocket
CAsyncSocket与CSocket的区别
介绍MFC中CAsyncSocket与CSocket的区别,并举例说明


网络编程

