关于IOCP,急!!!

hnzlk 2008-11-08 11:38:43
bool bIORet = GetQueuedCompletionStatus(pserv->m_hCompPort,&dwIoSize,(LPDWORD) &pClient,&lpOverlapped,INFINITE);

我在和下位机通信的时候,总是只能收到一个字节。比如下位机返回"0xFF0x010x010x010x01",dwIoSize的值总是为1,要分开接收好很多次才能接收完,而如果是电脑返回的数据,可以一下子完部接收完。
这是为什么呢?
...全文
171 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hnzlk 的回复:]
有啥好的解决办法?能像bcb自带的控件一样,能接收到多一点?
[/Quote]
找Microsoft吧.
hnzlk 2008-11-10
  • 打赏
  • 举报
回复
有啥好的解决办法?能像bcb自带的控件一样,能接收到多一点?
caitian6 2008-11-10
  • 打赏
  • 举报
回复
学习
僵哥 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hnzlk 的回复:]
引用 3 楼 unsigned 的回复:
不要问为什么一次性可以接收.能够一次性接收到,那只是偶尔现象.


好像不是偶然现象。
[/Quote]
如果你的设备过慢,而TCP的间隔时间是特定的,当然不一定是偶然.
hnzlk 2008-11-10
  • 打赏
  • 举报
回复
好像TCP的待待时间是可以设的吧
hnzlk 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 unsigned 的回复:]
不要问为什么一次性可以接收.能够一次性接收到,那只是偶尔现象.
[/Quote]

好像不是偶然现象。
hnzlk 2008-11-10
  • 打赏
  • 举报
回复
那像serversocket控件呢,是啥原理。能一次性接收。完成端口做不到吗?
僵哥 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hnzlk 的回复:]
比如返回一条指令"0xFF0x010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。
[/Quote]
首先TCP是流协议,其中并没有规定如何分包,对于接收程序来说,只能根据两个条件:
1.接收缓冲区满
2.超过一定时间间隔
当客户端发送较慢的时候,两个包之间的间隔时间就会超过TCP的等待时间,从而完成端口就会发完成通知给应用层.这属于正常现象.关键在于发送端的设备效率及发送逻辑.
nbzip 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hnzlk 的回复:]
比如返回一条指令"0xFF0x010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。
[/Quote]

你要看机器是如何发送给你的,是一次一次发送的,还是一次发三条......你应该设包头,包尾,包校验位.
这样,你收到一条信息就能只道是否是完整,下次是否还要再收一次了.如果收到,告诉机器,我收到了,你
别发了.呵呵.
hnzlk 2008-11-10
  • 打赏
  • 举报
回复
比如返回一条指令"0xFF0x010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。
hnzlk 2008-11-10
  • 打赏
  • 举报
回复
比如返回一条指令"0xFF0x010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。
hnzlk 2008-11-10
  • 打赏
  • 举报
回复
比如返回一条指令"0xFF0x010x01",只能一次接收"0xFF",像上述指令,要三次才能接收完成。
yuanreid 2008-11-10
  • 打赏
  • 举报
回复
如果你希望接收的慢点或由自己控制什么时候接收,改用同步或异步select方式算了。但是,这种靠提顿的方式避免数据包被拆分,并不可取,当遇到特殊情况或异常情况下,必须要自己解决分包的问题。
hnzlk 2008-11-10
  • 打赏
  • 举报
回复
我设置了TCP的超时接收时间也不行?
//int TimeOut=5000; //设置接收超时5秒
//if(::setsockopt(m_sListen,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
yuanreid 2008-11-09
  • 打赏
  • 举报
回复
socket有几种模式,其中IOCP是效率比较高的,可以及时发现端口上的数据变化,因此如果客户端的数据发送的比较慢,有可能出现数据不能一次接收完成,这也是做IOCP模式时,必须要程序员去处理的工作。ServerSocket有可能使用的是其他模式,不能作为比较
僵哥 2008-11-08
  • 打赏
  • 举报
回复
发送的频率问题.达不到足够的速度,所以在接收端需要依照流协议进行接收,并加以缓存和分包.
僵哥 2008-11-08
  • 打赏
  • 举报
回复
不要问为什么一次性可以接收.能够一次性接收到,那只是偶尔现象.
hnzlk 2008-11-08
  • 打赏
  • 举报
回复
如何按流式协议进行接收呢,为什么用serversocke控件可以一次性接收我的指令,我的数据量非常小。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧