【问题标题】:How to get an IP address from Socket如何从 Socket 获取 IP 地址
【发布时间】:2010-06-29 16:18:44
【问题描述】:

我正在尝试获取一个绑定到receiveSock 的IP 地址。我怎样才能得到它。

问题 1:

ipEndReceive = new IPEndPoint(IPAddress.Any, receivePort);
receiveSock = new Socket(AddressFamily.InterNetwork
                        , SocketType.Stream, ProtocolType.Tcp);

receiveSock.Bind(ipEndReceive);

当代码到达绑定函数时。发生错误

参数无效,错误代码:10022, 消息:无效的参数是 提供

问题 2:

ipEndReceive = new IPEndPoint(IPAddress.Parse("127.0.0.1"), receivePort);
receiveSock = new Socket(AddressFamily.InterNetwork
                        , SocketType.Stream, ProtocolType.Tcp);                   
receiveSock.Bind(ipEndReceive);

ErrorLog.WritetoErrorlog("\nRemote IP Address : " + ((IPEndPoint)receiveSock.RemoteEndPoint).Address.ToString()

当我尝试使用此 IP 时。它向我显示与上面相同的错误

【问题讨论】:

  • @tanascius:感谢您让我意识到自己的错误。我现在格式化了。
  • thx,阅读和回答格式良好的问题确实更容易^^

标签: c# sockets tcp network-programming


【解决方案1】:

首先,它看起来像是您想要的本地端点。其次,当您指定IPAddress.Any (0.0.0.0) 时,您明确声明Socket 不会绑定到任何特定接口。每个 IP 地址只匹配一个接口。

var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(new IPEndPoint(IPAddress.Any, somePort));
Trace.WriteLine(s.LocalEndPoint); // should be what you're looking for

套接字已绑定,将用于接收连接。它没有RemoteEndPoint。这应该非常清楚,因为Accept 方法返回一个新的Socket 对象,该对象表示两个端点(本地/远程)之间的连接。

注意:这是一个 IPv4 套接字 (AddressFamily.InterNetwork),所以不要尝试将其绑定到其他任何东西。

查看MSDN 上的文档,您可以在那里了解有关典型 Winsock 编程(因为 Socket 类只是 Winsock 包装器)的更多信息。

【讨论】:

  • 谢谢解释。你能把你的前三行说明一下吗?我不确定您要解释什么。 socket要绑定到没有特定的接口这里interface代表什么
  • interface 指的是网络堆栈中的特定组件。您的计算机可以通过多种方式连接到互联网(或本地网络)。您可以有多个连接(有线和无线)。每个活动接口都代表这样一个连接,并具有不同的 IP 地址。当您键入netsh interface ipv4 show addresses 时,您将获得所有当前安装的网络接口的列表。一种这样的接口是具有静态 IP 地址127.0.0.1 的环回接口。当我说没有特定接口时,我的意思是可以在任何接口上建立连接。
  • 如果您的计算机是网关或防火墙,您可以通过仅允许特定接口上的连接来限制来自网络任一端的访问。不过,我相信这与网络分段有关,而不是您原来的问题。
猜你喜欢
  • 2010-10-10
  • 1970-01-01
  • 2012-01-02
  • 2011-10-02
  • 1970-01-01
  • 2010-09-06
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多