【问题标题】:Why does libpcap have a struct pcap_addr_t that uses sockaddr_in to define addresses on a device?为什么 libpcap 有一个结构 pcap_addr_t 使用 sockaddr_in 来定义设备上的地址?
【发布时间】:2013-06-30 04:16:03
【问题描述】:

我很好奇为什么在pcap_addr_t 内部使用sockaddr,这是在调用pcap_findalldevs 时给你的。这不是那么直接的原因是因为sockaddr_in 包含有关地址端口的信息。这类似于 .NET 的 System.Net.IPEndPoint 类。

如果我们正在查看一个 .NET 库,我不希望看到像这样的属性,其中包含有关属于设备的地址的描述。据我所知,在描述系统上的设备时,没有协议定义地址和端口。

在我的所有设备(仅限 IPv4 和 IPv6)上,端口为 0。

何时将地址和端口关联到设备作为其拥有的端点之一是有益的?我问的原因是因为我正在为 libpcap 开发一个 C# 绑定,并且想知道以 System.Net.IPEndPoint 属性的形式向用户公开来自 sockaddr_in 的所有数据是否有用或只是错误/愚蠢在我的 NetworkDeviceAddress 类中,它描述了特定设备拥有的地址。

【问题讨论】:

    标签: c# .net network-programming libpcap


    【解决方案1】:

    何时将地址和端口关联到设备作为其拥有的端点之一是有益的?

    充其量很少,而且可能永远不会。您假设这就是使用 sockaddr 的原因。

    实际上,它被用作支持多种地址类型的一种方式;是的,sockaddr可能包含一个端口号,如果它是AF_INETAF_INET6,但是,正如“如果它是”子句所暗示的那样,它还包含一个地址族值。 p>

    libpcap/WinPcap 是一个跨平台库,最初是为 BSD UN*X 创建的,早在 .NET 甚至存在之前就创建了,所以它显然没有考虑到 .NET 的网络对象. (pcap_findalldevs() 不是原始 libpcap 中的 API,但它是在 2001 年 8 月至 9 月添加的,当时是 .NET 1.0 的最终版本发布之前。)

    pcap_findalldevs() 没有将端口号设置为任何重要的值,因此无需在包装器中公开它。

    【讨论】:

    • 很公平。我想使用熟悉的结构很方便,尤其是在过去。我想如果有一天,有人可以制定一个新协议并将设备分配给某些地址和端口,sockaddr 仍然是合适的。我只是想确保没有人知道有任何理由公开完整的 sockaddr 而不仅仅是 IP 地址。
    • sockaddrs 不包含端口; sockaddr_ins 和 sockadr_in6s 这样做,他们这样做是因为它们都用于指代 IPv4/IPv6 端点和 TCP/UDP 端点。在网络堆栈的 same 层拥有地址和端口的唯一方法是使用与 Internet 协议非常不同的协议;到那时,很多网络内容可能需要重新架构,包括 .NET 网络内容。
    • sockaddr_insockaddr_in6的意思是,谢谢指正。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2015-05-05
    • 2015-12-23
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多