c - 为什么在结构和套接字创建中提到套接字的地址族?

标签 c linux sockets

我的疑问是套接字程序中的行代码。地址族在 serv_addr.sin_family = AF_INET; sockaddr_in 结构中指定,但为什么我们要在 socket(AF_INET, SOCK_STREAM, 0); 套接字创建中提及相同内容.两句话中的family address是什么意思?

struct sockaddr_in serv_addr; 
listenfd = socket(AF_INET, SOCK_STREAM, 0);//here 

serv_addr.sin_family = AF_INET;//and here
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

最佳答案

socket() 创建一个新套接字。它需要知道它的地址族是什么,以便它知道允许使用哪种地址,无论是 IPv4、IPv6、IPX、NetLink 等。地址族规定了其地址值的布局和格式。例如,AF_INET 只允许 IPv4 地址,而 AF_INET6 允许 IPv6 地址(如果套接字在支持该功能的平台上设置为双栈模式,则允许 IPv4 地址)。

每个 sockaddr_... 结构都有一个 family 字段。 sockaddr_... 结构可以传递给各种函数,这些函数需要知道它们作为输入接收的地址类型,并可以指定它们作为输出返回的地址类型。

sockaddr_in 结构仅特定于 IPv4 地址,其中其 sin_addr 字段将 IPv4 地址指定为网络字节顺序的 32 位整数。其他 sockaddr_... 结构并非如此。

有一个特殊的sockaddr_storage 结构,通常在编写处理多个地址族的代码时使用,尤其是在调用可以接受多个sockaddr_... 类型的函数时.

因此,不仅告诉套接字它的地址族是什么很重要,而且对于各个地址指定它们自己的类型也很重要。通常,这些值将相互匹配(双栈套接字除外)。

关于c - 为什么在结构和套接字创建中提到套接字的地址族?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29551651/

相关文章:

sql-server - 适用于 Linux Docker 版本的 MSSQL Server

linux - 让 gdb 使用更少的内存

c - 优化 C 循环以获得数组的对角线

c - Minimax 算法并检查每个选项/跟踪 C 中的最佳移动

无法比较两个 CLLocation 坐标 2D(负零??)

linux - Linux中的系统调用和文件操作

java - 当简单的 Java Nio 客户端发送消息时 Netty 服务器抛出异常

objective-c - iOS 9 SDK Objective-C 的 WebSockets 客户端

c# - 发送时无法立即完成非阻塞套接字操作

c - 在C中的循环中获取变量的地址