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

时间:2015-04-10 01:04:18

标签: c linux sockets

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

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);

1 个答案:

答案 0 :(得分:2)

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

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

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

在编写适用于多个地址族的代码时,通常会使用特殊的sockaddr_storage结构,尤其是在调用可接受多个sockaddr_...类型的函数时。

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