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",像上述指令,要三次才能接收完成。

引用 7 楼 hnzlk 的回复:
比如返回一条指令"0xFF0×010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。

你要看机器是如何发送给你的,是一次一次发送的,还是一次发三条……你应该设包头,包尾,包校验位.
这样,你收到一条信息就能只道是否是完整,下次是否还要再收一次了.如果收到,告诉机器,我收到了,你
别发了.呵呵.

引用 7 楼 hnzlk 的回复:
比如返回一条指令"0xFF0×010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。

首先TCP是流协议,其中并没有规定如何分包,对于接收程序来说,只能根据两个条件:
1.接收缓冲区满
2.超过一定时间间隔
当客户端发送较慢的时候,两个包之间的间隔时间就会超过TCP的等待时间,从而完成端口就会发完成通知给应用层.这属于正常现象.关键在于发送端的设备效率及发送逻辑.

  那像serversocket控件呢,是啥原理。能一次性接收。完成端口做不到吗?

引用 3 楼 unsigned 的回复:
不要问为什么一次性可以接收.能够一次性接收到,那只是偶尔现象.

好像不是偶然现象。

好像TCP的待待时间是可以设的吧

引用 11 楼 hnzlk 的回复:
引用 3 楼 unsigned 的回复:
不要问为什么一次性可以接收.能够一次性接收到,那只是偶尔现象.

好像不是偶然现象。


如果你的设备过慢,而TCP的间隔时间是特定的,当然不一定是偶然.

学习

  有啥好的解决办法?能像bcb自带的控件一样,能接收到多一点?

引用 15 楼 hnzlk 的回复:
  有啥好的解决办法?能像bcb自带的控件一样,能接收到多一点?

找Microsoft吧.

我设置了TCP的超时接收时间也不行?
  //int  TimeOut=5000;  //设置接收超时5秒
  //if(::setsockopt(m_sListen,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)

如果你希望接收的慢点或由自己控制什么时候接收,改用同步或异步select方式算了。但是,这种靠提顿的方式避免数据包被拆分,并不可取,当遇到特殊情况或异常情况下,必须要自己解决分包的问题。