【问题标题】:Determining local IP address in P2P application在 P2P 应用程序中确定本地 IP 地址
【发布时间】:2011-06-07 02:50:42
【问题描述】:

我正在开发一个 P2P 应用程序,其中对等方与服务器交谈以告知其私有和公共 IP。应用程序使用 UDP 进行通信。

为了获取客户端使用的私有 IP,gethostbyname 并将其绑定到该 IP。问题是当系统有多个 NIC 时。问题是当其中一个 NIC 未连接到 Internet 时。所以为了避免它,我使用INADDR_ANY 并绑定它。

现在我需要获取我的本地 IP 地址以通知服务器。是否有任何 API 可以告诉我 NIC 的哪个 IP 地址处于活动状态?

【问题讨论】:

    标签: winapi sockets udp winsock


    【解决方案1】:

    您需要绑定到显式 IP 地址而不是 INADDR_ANY,因为绑定到 INADDR_ANY 意味着在套接字上调用 getsockname() 以获取本地地址只会返回 INADDR_ANY

    因此,您需要做的是迭代可用端点(使用getaddrinfo())并在每个端点上创建一个套接字。如果您稍后在它们上调用getsockname(),它们将为您提供正确的地址。

    【讨论】:

    • 我们不能使用特定的 IP 来绑定它,因为我们永远不知道哪个 IP 处于活动状态。这就是为什么我使用 INADDR_ANY 进行绑定,以便任何到达的数据包都能正确传递。
    • 这就是为什么我建议您遍历所有接口并绑定到每个接口。如果您还想处理添加的新接口等,那么您还需要监听接口更改。绑定到INADDR_ANY 将始终导致getsockname() 返回INADDR_ANY,因为这就是套接字绑定的内容。
    • 如果我绑定到所有地址,我将如何确定我使用哪个 IP 来发送数据?服务器中是否有任何方法可以确定客户端的私有 IP
    • 您将一个套接字绑定到每个可用 IP。如果客户端连接到您,那么您将通过使用getsockname() 查询 recvFrom 完成的套接字来知道 IP。然后,您在同一个套接字上做出响应。您可以通过在套接字上调用getpeername() 来查找客户端的公共IP。您可能需要考虑 NAT 问题。
    • 使用connect(),它适用于UDP和TCP(对于UDP,因为它是无连接的,connect()将简单地锁定哪个接口用于该套接字上的所有UDP数据包)。在connect() 返回成功后,getsockname() 将不再返回INADDR_ANY(根据WinSock 文档,您可能必须先在UDP 套接字上执行I/O,然后getsockname() 才能知道本地接口)。跨度>
    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2013-03-29
    • 2011-02-05
    • 2016-10-05
    相关资源
    最近更新 更多