当前位置:编程学习 > C#/ASP.NET >>

C#中Socket.RemoteEndPoint强制转换成IPEndPoint后,得到的port到底是什么呀????

实现两个peer通过一个index server进行连接,两个peer之间并不知道对方的地址,但是它们启动时就向index server进行注册,index server有他们的地址信息
现在我遇到的问题是,用指定的端口号(例如8080)来新建peer1与index server之间的socket连接,但是在index server端用RemoteEndPoint端口号却是个很奇怪的数(不是8080),而且经常在变,peer2利用这个端口号也无法连接到peer1
纠结了很久了也没有想明白为什么,希望各位大神可以给点儿提示,万分感谢>3333333<

相关的代码如下
peer端
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress myIpAddr = IPAddress.Parse(myIpAddress.Text.Trim());//ipAddr=address
IPEndPoint myEdp = new IPEndPoint(myIpAddr, int.Parse("2020"));//edp=endpoint
serverSocket.Bind(myEdp);

服务器端
port = (IPEndPoint)clientSocket.RemoteEndPoint.port; --------------------编程问答-------------------- RemoteEndPoint强制转换为IPEndPoint是语法需要,原因是在这里它就是IPEndPoint,不然是无法转换的。
SOCKET连接的发起方一般都是使用的随机空闲PORT,原因是端口不能重复使用。
楼主说的8080端口应该是index server的服务端口,连接成功后,双方都有各自的端口。
peer1与peer2互联的问题,也必须有一方打开端口侦听,相当于 index server 的模式,
另一方才可以连接的,楼主要是实现TCP打洞吧,的确有点复杂的。 --------------------编程问答--------------------
引用 楼主 pmwl007 的回复:
实现两个peer通过一个index server进行连接,两个peer之间并不知道对方的地址,但是它们启动时就向index server进行注册,index server有他们的地址信息
现在我遇到的问题是,用指定的端口号(例如8080)来新建peer1与index server之间的socket连接,但是在index server端用RemoteEndPoint端口号却是个很奇怪的数(不是8080),而且经常在变,peer2利用这个端口号也无法连接到peer1
纠结了很久了也没有想明白为什么,


正常的情况,都是如此。以为我们大多都是通过NAT路由机制上外网。

有些人只会做点在一个小办公室里边同一网段的所谓c/s程序,他就没有理解过NAT路由器机制。但是你一旦接触了,就应该明白,开发互联网软件的人都应该知道它。实际上,就算是稍微大一点的单位,它们有自己的多层(比如说3层)路由器,也一样是对不同办公室里的网段进行NAT处理的。比如说你可以到一个有着1000人的中小型机关,你会发现不同楼里、不同单位的电脑的ip可能都是 192.168.0.xxx,会有重复的。这丝毫没有影响。 --------------------编程问答--------------------
引用 1 楼 tcmakebest 的回复:
RemoteEndPoint强制转换为IPEndPoint是语法需要,原因是在这里它就是IPEndPoint,不然是无法转换的。
SOCKET连接的发起方一般都是使用的随机空闲PORT,原因是端口不能重复使用。
楼主说的8080端口应该是index server的服务端口,连接成功后,双方都有各自的端口。
peer1与peer2互联的问题,也必须有一方打开端口侦听,相当于 index server 的模式,
另一方才可以连接的,楼主要是实现TCP打洞吧,的确有点复杂的。


我看到lz贴出的代码,使用了端口2020(而不是8080),而不是“随机空闲PORT”。 --------------------编程问答-------------------- 如果,你只是在一个简单的小办公式的局域网里边测试,那么可能你的所谓 serverSocket 没有用来联服务器,而是你另外又搞了一个所谓 Socket 去联服务器,这才造成服务器的 RemoteEndPoint 的端口号不是 2020。

对于TCP来说,如果要用自己监听的端口作为客户端与另一方通讯,需要在你的serverSocket上使用其提供的方法先声明“端口复用”。

不过我觉得这些可能对于你都没有太多意义。客户端它监听了2020端口,那么peer之间直接使用这个端口通信就行了,管它什么8080?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,