当前位置: 首页 > 知识库问答 >
问题:

WinSock2 sokaddr结构作为参数

姜羽
2023-03-14

像inet_ntop、WSAAddressToString、recvfrom这样的函数还需要提供实际sockaddr结构或地址族的大小,这有什么意义?

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

那么,增加大小(sockaddr_in/sockaddr_in 6)和AF_INET/AF_INET6的原因是什么?

共有1个答案

端木弘方
2023-03-14

sockaddr是一种传统类型。有更新的sockaddr\u 特定地址族的类型,如IPv4的sockaddr\u和IPv6的sockaddr\u in6,它们具有不同的字节大小。API在通用的sockaddr*指针上运行部分是出于历史原因,部分是出于灵活性。套接字API可识别多种地址类型。通常必须提供大小,以便API可以验证内存缓冲区是否足够大,以便根据指定的系列传递地址数据(AF_INET用于IPv4,AF_INET6用于IPv6)。

inet\u ntop()In\u addrIn 6\u addr中不包含地址族,因此必须单独传递它。您负责确保为要传递的输入类型指定正确的地址族。

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

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

 类似资料:
  • 你能以通常做法把结构作为参数传递。例如: void printPoint ( Point p) { cout << "(" << p.x << ", " << p.y << ")" << endl; } printPoint方法把一个point作为参数,并以标准格式将其输出。若调用printPoint(blank),则会输出(3,4)。 作为第二个例子,可重写5.2节的distance函

  • 问题内容: 这是一段可以毫无问题运行的代码: 但是,如果该函数存在于另一个包中(例如),则该代码将不起作用: 我的问题是: 有没有一种方法可以使用匿名结构作为参数来调用(公共)函数(又名上文)? 以空struct作为参数的函数(也称为上文)可以被调用,即使它存在于另一个包中。这是特例吗? 好吧,我知道我总是可以命名来解决问题,我对此感到很好奇,并且想知道为什么似乎不允许这样做。 问题答案: 您的匿

  • 第三方DLL有一个函数,该函数需要一个指向结构的指针作为参数: 它将手指指纹(通常为4个)的“拍打”图像分割成单独的指纹(手指的文件名)。 SrapInfo的定义是: C中的示例片段: 根据JNA常见问题解答,在我的情况下,我应该使用“结构”: 所以,我用Java/JNA做了这样的映射: 但是使用这种方法,我得到了错误: 我还尝试了: < li >指针引用而不是SlapInfo。ByReferen

  • 我正在使用一个第三方库函数,它有大量的位置参数和命名参数。在我的代码中,从多个点使用相同的参数/值调用该函数。 为了便于维护,我不想在代码中多次硬编码几十个相同的参数。我希望有一种方法可以在数据结构中存储它们一次,所以我只需要传递数据结构。按照以下思路: 假设我调用的函数的签名如下: 假设在我的代码中,我想用 for arg1, for arg2 for arg4 (而且我没有使用arg3)。 我

  • 当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 参考 那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。 一般说来,你不需要担心这个,只是在参考上有些细微的效果需要你注意。这会通过下面这个例子加以说明。 对象与参考 例9.6 对象与参考 #!/usr/bin/python # Filename: reference.py print

  • 问题内容: 谁能给我一个网站的引用,该网站包含主要Java数据结构的摘要以及它们各自的时间复杂度(对于某些给定的操作(例如添加,查找,删除)),例如s是O(1)用于查找,而s是在…上)。一些细节,如内存使用情况也将很好。 这对于思考算法的数据结构非常有帮助。 问题答案: 是否有理由认为Java的实现(就复杂性而言)与通用的,与语言无关的实现不同?换句话说,为什么不仅仅参考关于各种数据结构的复杂性的