C++Builder 程序员博客
11 Nov
bool bIORet = GetQueuedCompletionStatus(pserv->m_hCompPort,&dwIoSize,(LPDWORD) &pClient,&lpOverlapped,INFINITE);
我在和下位机通信的时候,总是只能收到一个字节。比如下位机返回"0xFF0×010x010×010x01",dwIoSize的值总是为1,要分开接收好很多次才能接收完,而如果是电脑返回的数据,可以一下子完部接收完。
这是为什么呢?
如何按流式协议进行接收呢,为什么用serversocke控件可以一次性接收我的指令,我的数据量非常小。
不要问为什么一次性可以接收.能够一次性接收到,那只是偶尔现象.
socket有几种模式,其中IOCP是效率比较高的,可以及时发现端口上的数据变化,因此如果客户端的数据发送的比较慢,有可能出现数据不能一次接收完成,这也是做IOCP模式时,必须要程序员去处理的工作。ServerSocket有可能使用的是其他模式,不能作为比较
比如返回一条指令"0xFF0×010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。
比如返回一条指令"0xFF0×010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。
比如返回一条指令"0xFF0×010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。
你要看机器是如何发送给你的,是一次一次发送的,还是一次发三条……你应该设包头,包尾,包校验位.
这样,你收到一条信息就能只道是否是完整,下次是否还要再收一次了.如果收到,告诉机器,我收到了,你
别发了.呵呵.
那像serversocket控件呢,是啥原理。能一次性接收。完成端口做不到吗?
好像不是偶然现象。
好像TCP的待待时间是可以设的吧
学习
有啥好的解决办法?能像bcb自带的控件一样,能接收到多一点?
我设置了TCP的超时接收时间也不行?
//int TimeOut=5000; //设置接收超时5秒
//if(::setsockopt(m_sListen,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
如果你希望接收的慢点或由自己控制什么时候接收,改用同步或异步select方式算了。但是,这种靠提顿的方式避免数据包被拆分,并不可取,当遇到特殊情况或异常情况下,必须要自己解决分包的问题。