找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3733|回复: 6

问个tcp传递消息的问题。

[复制链接]
发表于 2008-4-23 13:53:11 | 显示全部楼层 |阅读模式
TCP在对端之间传递的是流,所以消息的边界只能由自定义的结构体来界定。
我在程序里面把要传递的消息分装成一个复合的ACE_Message_Block,第一个是存放消息头(里面有具体消息的大小),并且这个消息头的大小是我所知道的,第二个消息存放的是消息体(我想传递的内容)。
如果在proactor里面,我可以通过发起一个指定长度的读操作来读消息的头,将其中具体的消息体的长度解析出来,然后再发起一个读操作,就可以把消息体读出来,通过这个循环就可以源源不断的接受消息。
但是在reactor里面,我该怎么做呢??handle_input里面可以是一个完整消息,也可能是多个完整的消息,也有可能是部分完整,部分不完整的消息(这种可能性存放么??)
因为我试过,在客户端发送消息用一个循环send了10个消息(就是如上描述的消息,这些消息很小几个字节的),服务器一个recv就都收到了,这样处理起来不就很麻烦吗??还有传说中的粘包问题,半包问题。那要将消息重新打包,这个处理也太复杂了一点吧。我想用CDR也同样存在这些问题吧。
      谢谢各位大侠指点指点。

[ 本帖最后由 garfieldcatcat 于 2008-4-23 13:54 编辑 ]
发表于 2008-4-23 14:12:29 | 显示全部楼层
这个问题我也关注。
是否可以给消息加头标志和尾标志收到后重新打包呢?
或者能否按照ACE_wrappers\examples\Reactor\TP_Reactor\ReadHandler.cpp中handle_input()中,按照收到的大小去分配那么大的空间,在按那个大小收。期待更多回答。
发表于 2008-4-23 14:13:07 | 显示全部楼层
等你熟悉了TCP数据的处理就简单了。
可以用这样的简单措施来处理:
来了数据,不管后面缓冲区有多少,先只接收TCP数据结构头部,收到头部后,判断后面数据的长度,继续接收直到这个消息完成。然后再接收头部,重复操作。
中间如果有错误,抛弃或者返回错误信息即可。
发表于 2008-4-23 14:19:11 | 显示全部楼层
哦。意思是先接收n个长度(定长),解析之后,得知需要再收m个长度,是消息实体。
似乎类似那个example的意思。多谢了。

[ 本帖最后由 sokiiya 于 2008-4-23 14:21 编辑 ]
 楼主| 发表于 2008-4-23 14:33:44 | 显示全部楼层
嗯,谢谢,我有点想通了,我原来的疑问的这个在handle_input里面的循环不知道什么时候退出,其实它在recv_n那个头的时候读不到数据了就可以退出了,请问我这个理解正确吗???
发表于 2008-4-23 15:41:40 | 显示全部楼层
可以这么理解,但是要判断,是因为什么原因读取不到的。
发表于 2008-4-23 23:07:38 | 显示全部楼层
学习了:lol :victory:
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 13:25 , Processed in 0.042556 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表