详解C#获取本机IP地址(ipv4)的代码案例


本文摘自PHP中文网,作者黄舟,侵删。

本文主要介绍了C#获取本机所有IP地址的方法、C#获取本机IP地址(ipv4)的方法等。具有很好的参考价值。下面跟着小编一起来看下吧

获取本机所有IP地址:

这些地址是包含所有网卡(虚拟网卡)的ipv4和ipv6地址。

1

2

string name = Dns.GetHostName();

IPAddress[] ipadrlist = Dns.GetHostAddresses(name);

获取本机所有IPV4地址:

1

2

3

4

5

6

7

string name = Dns.GetHostName();

IPAddress[] ipadrlist = Dns.GetHostAddresses(name);

foreach (IPAddress ipa in ipadrlist)

{

  if (ipa.AddressFamily == AddressFamily.InterNetwork)

  Console.Writeline(ipa.ToString());

}

若要单单获取ipv4地址,可以用IPAdress.AddressFamily 属性判断:对于 IPv4,返回 InterNetwork;对于 IPv6,返回 InterNetworkV6。

然而如果本机可能有多个ipv4的地址,那如何获取访问默认网关时使用的网卡IP呢。在CSDN论坛找到了大神的方法,用的是查询本机路由表。

获取本机正在使用的ipv4地址(访问互联网的IP)

可别小看,还是有很多需要考虑的:

1.一个电脑有多个网卡,有线的、无线的、还有vmare虚拟的两个网卡。

2.就算只有一个网卡,但是该网卡配置了N个IP地址.其中还包括ipv6地址。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

/// <summary>

 /// 获取当前使用的IP

 /// </summary>

 /// <returns></returns>

 public static string GetLocalIP()

 {

 string result = RunApp("route", "print",true);

 Match m = Regex.Match(result, @"0.0.0.0\s+0.0.0.0\s+(\d+.\d+.\d+.\d+)\s+(\d+.\d+.\d+.\d+)");

 if (m.Success)

 {

  return m.Groups[2].Value;

 }

 else

 {

  try

  {

  System.Net.Sockets.TcpClient c = new System.Net.Sockets.TcpClient();

  c.Connect("www.baidu.com", 80);

  string ip = ((System.Net.IPEndPoint)c.Client.LocalEndPoint).Address.ToString();

  c.Close();

  return ip;

  }

  catch (Exception)

  {

  return null;

  }

 }

 }

 /// <summary>

 /// 获取本机主DNS

 /// </summary>

 /// <returns></returns>

 public static string GetPrimaryDNS()

 {

 string result = RunApp("nslookup", "",true);

 Match m = Regex.Match(result, @"\d+\.\d+\.\d+\.\d+");

 if (m.Success)

 {

  return m.Value;

 }

 else

 {

  return null;

 }

 }

 /// <summary>

 /// 运行一个控制台程序并返回其输出参数。

 /// </summary>

 /// <param name="filename">程序名</param>

 /// <param name="arguments">输入参数</param>

 /// <returns></returns>

 public static string RunApp(string filename, string arguments,bool recordLog)

 {

 try

 {

  if (recordLog)

  {

  Trace.WriteLine(filename + " " + arguments);

  }

  Process proc = new Process();

  proc.StartInfo.FileName = filename;

  proc.StartInfo.CreateNoWindow = true;

  proc.StartInfo.Arguments = arguments;

  proc.StartInfo.RedirectStandardOutput = true;

  proc.StartInfo.UseShellExecute = false;

  proc.Start();

  using (System.IO.StreamReader sr = new System.IO.StreamReader(proc.StandardOutput.BaseStream, Encoding.Default))

  {

  //string txt = sr.ReadToEnd();

  //sr.Close();

  //if (recordLog)

  //{

  // Trace.WriteLine(txt);

  //}

  //if (!proc.HasExited)

  //{

  // proc.Kill();

  //}

  //上面标记的是原文,下面是我自己调试错误后自行修改的

  Thread.Sleep(100);  //貌似调用系统的nslookup还未返回数据或者数据未编码完成,程序就已经跳过直接执行

      //txt = sr.ReadToEnd()了,导致返回的数据为空,故睡眠令硬件反应

  if (!proc.HasExited)  //在无参数调用nslookup后,可以继续输入命令继续操作,如果进程未停止就直接执行

  {    //txt = sr.ReadToEnd()程序就在等待输入,而且又无法输入,直接掐住无法继续运行

   proc.Kill();

  }

  string txt = sr.ReadToEnd();

  sr.Close();

  if (recordLog)

   Trace.WriteLine(txt);

  return txt;

  }

 }

 catch (Exception ex)

 {

  Trace.WriteLine(ex);

  return ex.Message;

 }

 }

另有一种方法通过用ipconfig来获取:

阅读剩余部分

相关阅读 >>

详解C#读取xml多级子节点的示例代码

C#向word文档插入和隐藏段落的方法介绍

C#如何使用?C#的基本语法

.net中创建webservice服务的实例分析(图文)

unity实现脚本插件[script create dialog]图文详解

详细介绍C#中调用formatmessage api

C#从枚举值获取对应文本的图文代码详解

深入讲解C#中委托的+=和-=

C#开发之winform(公共控件)

C#为什么用的人很少

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...