c - 套接字,为什么 ip 以整数格式发送?

标签 c sockets

问题

我想知道为什么我们可以通过使用 hton 之类的函数来连接到套接字来处理字节序,而我们本可以在普通字符数组中发送 ip。

假设我们要连接到 184.54.12.169

对此有一个解释,但我不明白为什么我们使用整数而不是 char,因此让我们自己陷入字节序 hell 。

我认为 char out_ip[] = "184.54.12.169"理论上可以成功。

请向我解释我在这里没有得到的微妙之处。

最佳答案

基本网络 API 是低级函数。这些是围绕内核系统调用的非常薄的包装器。删除这些低级函数,强制一切都使用字符串,对于像这样的低级 API 来说是相当糟糕的,特别是考虑到 C 中的字符串处理是多么繁琐。作为一个具体的障碍,即使 IP 字符串也不是固定长度的,所以处理它们比普通的 32 位整数要复杂得多。将字符串处理移至内核确实完全违背了内核的本意,处理任意用户字符串实际上是用户空间问题。

因此,您想创建更高级别的函数来接受字符串并在库中进行转换。但是,在核心库中各处添加这种更高级别的“便利”功能会使它们膨胀,因为传递 IP 号码当然不是这种便利的唯一地方。在成为标准(官方的,如 POSIX,或事实上的)库的一部分后,这些函数将需要永远维护并随处包含。

因此,删除低级函数并不是一个真正的选择,在同一个库中为更高级别的 API 添加更多函数也不是一个好的选择。

因此解决方案是使用另一个库来提供更高级别的网络 API,例如可以直接处理地址字符串。不确定 C 有什么,但它几乎是其他语言的给定,它们也有内置的“真实”字符串,因此使用它们并不麻烦。

关于c - 套接字,为什么 ip 以整数格式发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26048108/

相关文章:

c - 逆向工程递归函数

c - 如何从 sockaddr_in/sockaddr_in6 结构创建 sockaddr

node.js - 在允许继承事件冒泡之前捕获它

java - 为什么我的 Java 线程不同时运行?

java - 通过套接字传输多个文件时出错

谁能告诉我这个c程序有什么问题吗?

hudson 的 CUnit 失败显示成功

无法使用 fscanf 读取此文件

c - 虽然循环不会像 C 中预期的那样中断

c - C语言套接字编程