WinSock2 sockaddr结构作为参数

WinSock2 sockaddr structure as a parameter

本文关键字:参数 结构 sockaddr WinSock2      更新时间:2023-10-16

拥有inet_ntop, WSAAddressToString, recvfrom等函数也需要实际sockaddr结构的大小或要提供的地址族的意义是什么?

sockaddr结构的前两个字节表示地址族,因此也表示它实际上是sockaddr_in还是sockaddr_in6。

那么额外的sizeof(sockaddr_in/sockaddr_in6)和AF_INET/AF_INET6的原因是什么呢?

sockaddr是遗留类型。对于特定的地址族,有较新的sockaddr_...类型,如IPv4的sockaddr_in和IPv6的sockaddr_in6,它们具有不同的字节大小。api对通用的sockaddr*指针进行操作,部分是出于历史原因,部分是出于灵活性。套接字api可识别多种地址类型。您通常必须提供大小,以便api可以验证您的内存缓冲区是否足够大,可以根据指定的族(AF_INET为IPv4, AF_INET6为IPv6)传递地址数据。

inet_ntop()中,in_addrin6_addr不包含地址族,这就是为什么您必须单独传递它。您有责任确保您为传入的输入类型指定了正确的地址族。

WSAAddressToString()中,sockaddr*指向输入缓冲区的指针。您必须传递该缓冲区的分配大小。例如,由于sockaddr_in小于sockaddr_in6,如果您分配sockaddr_in但将其族设置为AF_INET6而不是AF_INET,缓冲区太小,函数无法访问所有IPv6字段,因此它将失败并出现WSAEFAULT错误而不是崩溃。

recvfrom()中,sockaddr*是指向输出缓冲区的指针。您必须预先分配它并传递分配的大小。如果你分配一个sockaddr_in,但收到一个IPv6数据包,发送者的地址将不适合你的缓冲区和功能将失败与WSAEFAULT错误。