找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4561|回复: 2

又有问题请教了:怎么分离不同端口的输入?

[复制链接]
发表于 2008-7-15 23:05:10 | 显示全部楼层 |阅读模式
现在有两个socket,分别在不同的端口侦听,在注册handle的时候应该如何注册才能分别交给不同的handle_函数来处理呢?

按照我现在的做法,不论哪个端口接受到数据,handle_input都会被触发,实际上,我只希望其中一个端口的输入触发handle_input,另一个的输入我希望交给主线程去处理,应该如何实现呢??
 楼主| 发表于 2008-7-15 23:05:16 | 显示全部楼层
不知道你的目的。
一般不同的socket,ACE产生不同的处理器来处理,这样,根本不会混淆。
 楼主| 发表于 2008-7-15 23:05:53 | 显示全部楼层
我猜想,可能是lz没把网络编程中的几个对象的责任搞清楚.这里,我凭记忆,把以前看到的一个非常棒的比喻复述一下,希望对你有帮助



我们以下馆子为例,当然,我这里说的馆子是稍稍好一点的正规的馆子,不是自助餐的那种。
您肚子饿了,这是一个触发的条件,这导致了主动发起事件的起因。您就是客户端。于是,您得找一家馆子,这个馆子就是服务端。客户端发起请求,服务端应答服务,这就是网络交互中最为常见的方式。
您要进入馆子,不能从窗上跳,更不能破墙,您必须大大方方的从正门进去。常常说的门就是网络编程的端口号了。一个馆子不能把门换来换去,所以端口号也不能随意的改。一些众所周知的服务,像web服务, ftp服务,时间服务,echo服务等等,他们都有固定的端口,您写的其它用途的应用程序,就不要用这些端口了。就像在一条大街上,不允许开同一个门牌号的的馆子一样。大街相当于一个机器,对应一个网卡,分配了一个IP。IP地址可以用点分十进制的方式表示,也可以用[url=http://www.serveraddress.com/]www.serveraddress.com[/url]这样的形式表示。
馆子门口会站一个领位员,这个领位员就相当于服务端的socket,而您则相当于客户端的socket。领位员必须站在自家门口,这就是绑定操作(bind())。所以,写程序的时候,不想忘了,让服务端的socket与IP地址以及端口进行bind()操作。
您来到馆子门口的时候,领位员接待了您,这个操作叫accept(),它是发生在服务端;而您作为客户端,需要的操作是connect()。
领位员把你带进馆子后,馆子会分配一个服务人员为你点餐,这里假设那个服务员仅为你提供服务。服务员则是服务端新创建的一个socket。 服务员和您之间是双向通讯的。你可以向他提出要求,他也可以向你提供服务。
而领位员则和你没有直接关系了。(她已经站在门口继续等待别的客人了).

socket api提供的功能,没有把通讯双方描述得很清晰。ACE提供了对象化的类,把它们形象化了。
Stream相当于双方交互的数据流,其中,相当于上例中的您和服务员
Connector相当于客人,connector在建立连接时,需要一个stream作参数,这个stream相当于上例中的您了。
Acceptor相当于领位员,它建立连接时,会创建一个stream,这个stream相当于服务员。stream的handle()就相当于socket api中的socket句柄了。
INET_Addr相当于地址,实例化时,需要端口号作参数
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-4 14:58 , Processed in 0.016425 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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