CSOCKET接收数据问题:一发多收和阻塞非阻塞等问题如何解决
双方均为MFC CSOCKET的派生类,客户端发送数据,无论是10个字节也好,20个字节也好,服务器端总是4个字节一收.比如说如果我发20个字节,那它就OnReceive五次.我用sniffer看过,发确实在一个数据包里发的.只可能是收出了问题,而接收用的缓冲区足够大.
我的每个数据包分两部分,前12个字节是自定义头部,中间有个字段指明了后面数据的长度.现在出现了上面的问题,我没法一次收完,但也不知道该怎么收.如果发的是正确的包,那我还可以先收头部(12字节),然后根据头部得到后面数据长度,再接收.但如果故意发个错误的包,就阻塞在那里了.
我试过用setsockopt设定接收缓冲区,但还是一次最多收4个字节;想把套接字设定成异步,用asyncselect将套接字设定成异步,用ioctl设FIONREAD,用setsockopt设SO_RCVTIMEO,函数都成功返回,但没有数据的时候仍然是阻塞在那里.我实在没有办法了.
现在程序的结构就这样了,不大可能不用CSOCKET的派生类.还有的救吗?