WinSock2 sockaddr结构作为参数
WinSock2 sockaddr structure as a parameter
拥有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_addr
和in6_addr
不包含地址族,这就是为什么您必须单独传递它。您有责任确保您为传入的输入类型指定了正确的地址族。
在WSAAddressToString()
中,sockaddr*
指向输入缓冲区的指针。您必须传递该缓冲区的分配大小。例如,由于sockaddr_in
小于sockaddr_in6
,如果您分配sockaddr_in
但将其族设置为AF_INET6
而不是AF_INET
,缓冲区太小,函数无法访问所有IPv6字段,因此它将失败并出现WSAEFAULT
错误而不是崩溃。
在recvfrom()
中,sockaddr*
是指向输出缓冲区的指针。您必须预先分配它并传递分配的大小。如果你分配一个sockaddr_in
,但收到一个IPv6数据包,发送者的地址将不适合你的缓冲区和功能将失败与WSAEFAULT
错误。
- 使用不带参数的函数访问结构元素
- 将结构字段的类型展开为可变模板参数
- MSVC将仅移动结构参数解释为指针
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 如何传递带有通过引用传递的结构参数的函数?
- 展开可变参数模板结构
- 在类构造函数中定义结构变量的参数
- 如何在方法中传递结构参数
- 我应该在C++中将这些结构用作参数化构造函数吗?
- 带参数的数据结构的全局声明
- C++ 带有默认参数的结构,可选择在构造函数中更改
- C++-将具有引用的长参数列表重构为结构
- 为私有结构定义双参数运算符重载
- 我们可以用参数化构造函数初始化结构的数组吗?
- 关于类的想法 参数结构给定实现
- 重映射模板参数结构
- 从C 调用的编译MATLAB函数的输入参数结构
- 如何实现具有不同参数结构的纯虚拟函数
- 如何在C++中获得可更改的函数参数结构
- 函数参数 -> 结构体成员的 void* 和常量 void* 的解决方案