Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IP选择套接字编程的问题#_C#_Sockets_Networking_Network Programming - Fatal编程技术网

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

C# IP选择套接字编程的问题#,c#,sockets,networking,network-programming,C#,Sockets,Networking,Network Programming,我正在创建一个服务器(基于桌面),它使用这段代码监听端口4504 IPAddress[] AddressAr = null; String ServerHostName = ""; try { ServerHostName = Dns.GetHostName(); IPHostEntry

我正在创建一个服务器(基于桌面),它使用这段代码监听端口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");
IPAddress[]AddressAr=null;
字符串ServerHostName=“”;
尝试
{
ServerHostName=Dns.GetHostName();
IPHostEntry ipEntry=Dns.GetHostByName(服务器主机名);
AddressAr=ipEntry.AddressList;
}
捕获(异常){}
if(AddressAr==null | | AddressAr.Length<1)
{
返回“无法获取本地地址…错误”;
}
Listener_Socket=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
Listener_Socket.Bind(新的IPEndPoint(AddressAr[0],Port));
侦听器\u套接字。侦听(-1);
beginacept(新的异步回调(EndAccept),Listener_套接字);
返回(“侦听”+AddressAr[0].ToString()+“:“+Port+”…确定”);
现在的问题是,我想在我的服务器上运行它,我想成为的AddressAr[0]的值是我服务器的公共IP,但这个代码段返回服务器的本地lan地址

就像我想要AddressAr[0]=“180.123.45.6”之类的东西[这是我服务器的公共IP],但是通过这个代码片段,我得到了AddressAr[0]=“192.168.2.2”

PS:我正在以桌面应用程序的形式运行此服务器,并且我的试用处于调试模式

我非常感谢你的帮助。
谢谢。

对服务器进行编程时,应始终侦听本地ip“127.0.0.1”,并且所有来自外部的连接将重定向到安装服务器的本地ip地址

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


我希望这有帮助。

您需要在本地主机上进行侦听,该主机将是您的
192.168.2.2
(这是正确的),然后将外部数据包/通信从您的公共地址转发到您的本地计算机

例如,如果您正在使用linksys路由器,您可以转到NAT/QOS并将特定端口上的任何传入流量转发到您的本地计算机地址
192.168.2.2


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

您只需监听您的机器拥有的任何IP地址:

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

@Joy这不是一个编程问题,更多的是一个网络问题,但由于它涉及到通过代码监听流量,它至少具有教育意义。因此,我不能将服务器上的端口直接暴露给外部环境?路由器上的端口转发是唯一的方法吗?这台服务器将托管在RackSpace云上,所以你的意思是我必须让RackSpace的伙计们调整路由器,将所有来自公共IP的端口请求转发到localhost:4502,比如184.123.4.4:4502?是的,这是唯一的方法。无论如何,你需要在你的路由器上设置这个。所以基本上你需要做的是:将端口转发从publicip:port添加到你的计算机上,就这样。如果您的服务器在运行,默认情况下,他们会将所有流量从您的公共IP传输到他们网络中的服务器,您只需要求他们打开您的端口即可。打开端口只意味着在防火墙中取消对其的阻止,或者还有更多。我试图从本地机器上解除防火墙的阻止,但当我使用端口扫描工具时,所需的端口仍然被阻止。你能帮个忙吗?是的,你需要在你的本地机器上为你的防火墙添加异常。我确实这样做了,然后甚至禁用了我的防火墙。然而,当我使用扫描时,我看到它被阻止了!