IP选择问题套接字编程C#

时间:2011-07-07 14:03:56

标签: c# sockets networking network-programming

我正在创建一个服务器(基于桌面),使用这段代码

监听端口4504
                IPAddress[] AddressAr = null;
                String ServerHostName = "";

                try
                {
                    ServerHostName = Dns.GetHostName();
                    IPHostEntry ipEntry = Dns.GetHostByName(ServerHostName);
                    AddressAr = ipEntry.AddressList;
                }
                catch (Exception) { }

                if (AddressAr == null || AddressAr.Length < 1)
                {
                    return "Unable to get local address ... Error";
                }

                Listener_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                Listener_Socket.Bind(new IPEndPoint(AddressAr[0], Port));
                Listener_Socket.Listen(-1);

                Listener_Socket.BeginAccept(new AsyncCallback(EndAccept), Listener_Socket);

                return ("Listening On " + AddressAr[0].ToString() + ":" + Port + "... OK");

现在的问题是,我想在我的服务器上运行它,而我想要的AddressAr [0]的值是我的服务器的公共IP,但是这个片段返回服务器的本地lan地址。

就像我想要AddressAr [0] =“180.123.45.6”某事[这是我服务器的公共IP],但是这个片段我得到了AddressAr [0] =“192.168.2.2”

PS:我将此服务器作为桌面应用程序运行,我的试用版处于调试模式。

我很感激任何帮助。 谢谢。

3 个答案:

答案 0 :(得分:1)

编程服务器时,应始终监听本地IP“127.0.0.1”,并将所有来自外部的连接重定向到安装服务器的本地IP地址。

来自外部的路由请求应该在您的路由器上处理。所以基本就是这样。

我希望这会有所帮助。

答案 1 :(得分:1)

您需要侦听本地主机,这将是您的192.168.2.2(这是正确的),然后将外部数据包/流量从您的公共地址转发到本地计算机。

如果你正在使用一个linksys路由器,你可以转到NAT / QOS并转发特定端口上的任何传入流量,例如: 4504到您当地的机器地址192.168.2.2

任何标准家用路由器都会在固件中内置端口转发功能。

答案 2 :(得分:0)

您可以简单地收听您的机器所拥有的任何IP地址:

listenerSocket.Bind(new IPEndPoint(IPAddress.Any, port));