|
楼主 |
发表于 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相当于地址,实例化时,需要端口号作参数 |
|