网络编程-如何不利用外网服务器的帮助来获取本机的公网IP?

发布于 2017-02-06 00:25:47 字数 51 浏览 1198 评论 2

如果在局域网内,要获取对外的公网IP的话需要外网服务器的帮助,如果没有,有没有办法获取?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜无邪 2017-11-01 04:15:17

可以通过ssdp discover服务实现

//获取外网IP

private static string GetExternalIP()
{

string pubIP = "";
string serviceUrl = "";
Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sk.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
string req = "M-SEARCH * HTTP/1.1rn" +
"HOST: 239.255.255.250:1900rn" +
"ST:upnp:rootdevicern" +
"MAN:"ssdp:discover"rn" +
"MX:3rnrn";
byte[] data = System.Text.Encoding.ASCII.GetBytes(req);
byte[] receive = new byte[0x1000];
IPEndPoint ipe = new IPEndPoint(IPAddress.Broadcast, 1900);
//发送数据,获取服务地址
sk.SendTo(data, ipe);
int length = 0;
length = sk.Receive(receive);
string resp = Encoding.ASCII.GetString(receive, 0, receive.Length).ToLower();
if (resp.Contains("upnp:rootdevice"))
{
resp = resp.Substring(resp.ToLower().IndexOf("location:") + 9);
resp = resp.Substring(0, resp.IndexOf("r")).Trim();
serviceUrl = GetServiceUrl(resp);//解析获取地址
}
//利用ssdp discover服务向serviceIP发送请求,存储返回结果,并在xml中解析出外网ip
string reqStr = "<?xml version="1.0"?>" +
"<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">" +
"<s:Body>" +
"<u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">" + "</u:GetExternalIPAddress>" +
"</s:Body>" +
"</s:Envelope>";
byte[] b = Encoding.UTF8.GetBytes(reqStr);
WebRequest wr = HttpWebRequest.Create(serviceUrl);
wr.Method = "POST";
wr.Headers.Add("SOAPACTION", ""urn:schemas-upnp-org:service:WANIPConnection:1#" + "GetExternalIPAddress" + """);
wr.ContentType = "text/xml; charset="utf-8"";
wr.ContentLength = b.Length;
wr.GetRequestStream().Write(b, 0, b.Length);
//
XmlDocument xml = new XmlDocument();
WebResponse ws = wr.GetResponse();
Stream ress = ws.GetResponseStream();
xml.Load(ress);
XmlNamespaceManager xmlMgr = new XmlNamespaceManager(xml.NameTable);
xmlMgr.AddNamespace("tns", "urn:schemas-upnp-org:device-1-0");
pubIP = xml.SelectSingleNode("//NewExternalIPAddress/text()", xmlMgr).Value;

return pubIP;

}

这个是协议介绍,你可以了解一下

晚风撩人 2017-04-11 00:46:39

可以利用ICMP协议来获取。首先设置TTL为1,那么返回的ICMP的地址就是网关地址,也就很有可能是本机在外网的地址。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文