首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

100分,解答网络通信疑义

2012-08-13 
100分,解答网络通信疑问C/C++ code1. 看到个问题: CAnsycSocket,是否是在服务端一个 socket(除去listen so

100分,解答网络通信疑问

C/C++ code
1. 看到个问题: CAnsycSocket,是否是在服务端一个 socket(除去listen socket),就可以应付几十个客户端 的socket了??貌似在服务断的OnRecive(WPARAM, LPARAM);   不能区分是哪一个客户端的socket.所以可以退出 在服务端,仅仅1个socket是不行的。那么如何却分是哪一个socket 呢??现在有1个服务端,多个客户端,用CAnsycSocket如何去做呢??2.  对于 监听的socket,是否也可以做位一个处理 网络通信的socket. 节约一个socket.3. 无论哪一方,只要调用了listen函数,是否就可以认为其是服务端。3个问题,希望高手解答。谢谢


[解决办法]
看不懂你1和2问题

回答你第3个问题:是的,服务器端才需要listen,accept。客户端直接bind,然后connect。
[解决办法]
我没用过 CAsyncSocket ,对网络编程也不太熟.不过,由于网络底层都是相同的,所以大致上,应该也能解释一二. 
若有错误,勿见怪.

1.
一个socket包含5个元素(本地ip,对端ip,本地端口,对端端口,协议),对于一个socket来说,这个5元组是唯一的.
底层的TCP/UDP协议,以及中间路经的所有路由就是依靠这个5元组去进行数据转发的.
既然socket是唯一的,自然每一个客户端的接入,都必须创建一个唯一的socket才行.
每一个接入的客户端的socket都是不同的,而且是不能公用的.

换句话说,你接入了多少个客户端,系统内部就会创建多少个socket. 至于 CAsyncSocket ,只是MFC对网络通信底层的一个封装而已,自然逃脱不了这个规律.

至于在 onReceive() 中如何区分每一个客户端? 
你可以参考一下这个帖子: http://topic.csdn.net/t/20020815/12/942791.html
这个帖子里面说, 在CAsyncSocket内部,对每一个socket都会创建一个 m_ClinetSocket 来储存相应的数据,而这些 m_ClinetSocket 是以数组的形式来管理的.
在 onReceive() 被调用的时候,实际上是调用 CAsyncSocket 里面的 m_ClinetSocket[i].onReceive() 函数.
而在 m_ClinetSocket 里面,有一个可以用的变量, 叫做 m_hSocket ,这个就是当前通信的socket! 
有了这个socket,就可以唯一区分一个客户端了,甚至在必要时调用某些api就可以获取这个socket对应的ip,端口等数据.

2.之前说了,一个完整的socket需要齐备5个元素,但监听socket只有3个元素(本地地址,本地端口,协议),因为剩余的2个元素必须等到客户端连接到来才能确定.
很自然了,这个 listin socket 只能用于监听. 这也是为什么每当连接到来,系统会自动创建一个新的socket来负责通信的原因了.

3.对.

热点排行