当前位置: 首页 > 面试题库 >

为什么在调用bind()时将sockaddr_in转换为sockaddr?

董翰墨
2023-03-14
问题内容

的绑定()函数接受一个指针sockaddr,但在我看到所有的实施例中,sockaddr_in结构来代替,并且被转换为sockaddr

struct sockaddr_in name;
...
if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
...

我无法确定为什么要使用sockaddr_in结构。为什么不只是准备并通过sockaddr

这只是约定吗?


问题答案:

不,不只是惯例。

sockaddr是用于任何类型的套接字操作的通用描述符,而是sockaddr_in特定于基于IP的通信的结构(IIRC,“ in”代表“
InterNet”)。据我所知,这是一种“多态性”:该bind()函数假装采用struct sockaddr *,但是实际上,它将假定传入了适当的结构类型;即,与您给它作为第一个参数的套接字类型相对应的套接字。



 类似资料:
  • 我一直在阅读文档并遍历头文件以理解结构,然而,还有最后一件事我无法获得。 头定义sockaddr结构,该结构至少包括以下成员:sa_family_t、sa_family address family char、SA_Data[]套接字地址(可变长度数据) 标头应定义sockaddr_in结构,该结构应至少包括以下成员:sa_family_t sin_family AF_INET。in_port_t

  • 问题内容: 我发现一些代码我工作的地方的点被强制转换,因为它是传递给方法。 为什么要这样做? 我知道这个问题涉及重载的方法,并使用类型转换来确定要调用的方法的版本。 但是,如果不执行强制类型转换,如果使用空参数调用该方法,那么是否会重选带有其他类型的参数的重载方法呢?那么演员阵容还能完成什么呢? 问题答案: 如果 未 执行转换,则将选择 最具体的 版本。 可以是type 或type 的空引用。因此

  • 问题内容: 我发现了一些奇怪的异常: 怎么可能呢?每个对象都可以转换为String,不是吗? 代码是: 谢谢。 问题答案: 为什么这不可能: 因为String和Integer不在同一对象层次结构中。 您尝试的转换仅在相同的层次结构中有效,例如 在这种情况下,或或将起作用。 因此,正如其他人已经提到的,要将整数转换为字符串,请使用: 或对于原始 要么 为对象。

  • 问题内容: 我有curl命令: 我想在Java API中创建HTTP请求,该操作将执行相同的操作。可以在本README中找到该curl命令。它用于开始在RabbitMQ上记录日志。回应并不重要。 现在,我创建了这样的内容(我删除了不太重要的行,例如捕获了异常等),但是不幸的是,它不起作用: 完整代码 问题答案: 这是最终的解决方案:

  • 问题内容: 在Python中,如何将列表转换为? 我需要知道,因为功能 希望将几个time_series对象作为传递,而我有一个timeseries对象列表。 问题答案: 您可以在迭代器之前使用运算符,以在函数调用中对其进行扩展。例如: (请注意之前) 从python文档中: 如果语法* expression出现在函数调用中,则表达式必须求值为可迭代。来自此迭代器的元素被视为附加的位置参数。如果存

  • 问题内容: 结合使用带有ReactJS的ES5开发,可以将组件描述如下: 在此的示例引用对象本身,这是预期的自然行为。 题 我的问题是: 如何使用ES6创建组件? 知道在JavaScript中使用new运算符时会引用实例化对象本身,因此有人可以告诉我使用bind的真正目的是什么?这和React的内部机制有关吗? 问题答案: 只是核心javascript。这是绑定事件的工作方式。这不是一个React