我怀疑是套接字程序中的行代码。地址族在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);
答案 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_...
类型的函数时。
因此,不仅要告诉套接字它的地址族是多么重要,而且个别地址也必须指定它们自己的类型。通常,这些值将相互匹配(双栈插槽除外)。