因为做项目的原因,C/S架构中要进行消息传递,以前做的时侯,服务器和客户端都是在一台电脑上,不涉及IP地址的问题,但是产品要发布,此时必须先知道对方的IP地址。
我采用的是本机获取自己的ip地址后,写入数据库,当需要传递消息时,从数据库中读出要传递的服务器或客户端的IP地址,然后将消息传递过去。
第一步,获取本机的IP地址:
如果是通过共享上网,通过NAT转换的,本机是不知道上网出口网关的IP地址的。
我程序里最终是通过,向网外发送一条信息,由对方告知你的出口IP地址,这个很容易实现,你可以自己写个程序放服务器上,也可以调别人的。
GetHostByName ( )方法的返回值时IPHostEntry 对象,此对象的属性 AddressList,是一个IPAddress类型的数组,包含了计算机此时的所有的IP地址信息。在ip01.cs中AddressList [0].Address是固定的IP地址,而对于上网动态分配的IP地址是.AddressList [1].Address。据此我们可以的得到读取拨号上网动态分配的IP地址的源程序:
System.Net.IPAddress addr;// 获得拨号动态分配IP地址addr = new System.Net.IPAddress ( Dns.GetHostByName ( Dns.GetHostName ( ) ) .AddressList [1].Address ) ;return addr.ToString ( ) ;
我们也可以通过设定AddressList的不同值来得到机器不同的IP地址。
// 通过外部网站返回得到内网外部IP
// 来源: http://www.cnblogs.com/helloworld84/archive/2005/08/18/218104.html
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
class PubIP
{
static string GetIP()
{
Uri uri = new Uri("http://www.ikaka.com/ip/index.asp");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = 0;
req.CookieContainer = new CookieContainer();
req.GetRequestStream().Write(new byte [0], 0, 0);
HttpWebResponse res = (HttpWebResponse)(req.GetResponse());
StreamReader rs = new StreamReader(res.GetResponseStream(), Encoding.GetEncoding("GB18030"));
string s = rs.ReadToEnd();
rs.Close();
req.Abort();
res.Close();
Match m = Regex.Match(s, @"IP:/[(?<IP>[0-9/.]*)/]");
if (m.Success) return m.Groups["IP"].Value;
return string.Empty;
}
static void Main()
{
Console.WriteLine(GetIP());
}
}
同时,我们也可以获取局域网中本机的IP地址:
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
class HostIP
{
static void Host() //局域网中获取主机地址
{
string ComputerName = Dns.GetHostName();
IPHostEntry myHost = new IPHostEntry();
myHost = Dns.GetHostEntry(ComputerName);
for(int i = 0;i < myHost.AddressList.Length;i++)
{
Console.WriteLine("{0}",myHost.AddressList[i].ToString());
}
}
static void Main()
{
Host();
Console.ReadLine();
}
}