PF_INET AF_INET的区别是什么?

其实是TCP/IP的设计者一开始想多了。
PF是protocol family,AF是address family,作者一开始以为可能某个协议族有多种形式的地址,所以在API上把它们分开了,创建socket用PF,bind/connect用AF。
结果一个PF只有一个AF,从来没有过例外,所以就混用了。
好的,下面是这段代码每一句的解释: ``` int make_server_socket_q(int, int); ``` 这一句声明了一个函数`make_server_socket_q`,它有两个整型参数。 ``` int make_server_socket(int protnum) { return make_server_socket_q(protnum, BACKLOG); } ``` 这一句定义了一个函数`make_server_socket`,它有一个整型参数`protnum`。函数体内部调用了`make_server_socket_q`函数,并传入了`protnum`参数和一个常量`BACKLOG`(在代码中未给出定义)。最后将`make_server_socket_q`函数的返回值作为`make_server_socket`函数的返回值。 ``` int make_server_socket_q(int portnum, int backlog) { struct sockaddr_in saddr; int sock_id; sock_id = socket(PF_INET, SOCK_STREAM, 0); if(sock_id == -1) { return -1; } bzero((void *)&saddr, sizeof(saddr)); saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(portnum); saddr.sin_family = AF_INET; if(bind(sock_id, (struct sockaddr*)&saddr, sizeof(saddr)) != 0) return -1; if(listen(sock_id, backlog) != 0) return -1; return sock_id; } ``` 这一句定义了一个函数`make_server_socket_q`,它有两个整型参数`portnum`和`backlog`。函数体内部: 1. 创建了一个`sock_id`变量,用于存储Socket的文件描述符。 2. 调用`socket()`函数创建了一个`PF_INET`类型的Socket,即基于IPv4协议的Socket。如果创建失败,返回-1。 3. 调用`bzero()`函数将`saddr`结构体变量的内存清零。 4. 设置`saddr`结构体变量的属性,包括IP地址、端口号和协议族类型。 5. 调用`bind()`函数将Socket绑定到指定的端口号上。如果绑定失败,返回-1。 6. 调用`listen()`函数监听Socket,设置等待连接队列的最大长度。如果监听失败,返回-1。 7. 返回`sock_id`变量作为函数的返回值。 ``` int connect_to_server(char *host, int portnum) { int sock; struct sockaddr_in servadd; struct hostent *hp; sock = socket(PF_INET, SOCK_STREAM, 0); if(sock == -1) return -1; bzero(&servadd, sizeof(servadd)); hp = gethostbyname(host); if(hp == NULL) return -1; bcopy(hp->h_addr, (struct sockaddr*)&servadd.sin_addr, hp->h_length); servadd.sin_port = htons(portnum); servadd.sin_family = AF_INET; if(connect(sock, (struct sockaddr*)&servadd, sizeof(servadd)) != 0) return -1; return sock; } ``` 这一句定义了一个函数`connect_to_server`,它有两个参数,分别是指向字符的指针类型的`host`,和整型类型的`portnum`。函数体内部: 1. 创建了一个`sock`变量,用于存储Socket的文件描述符。 2. 调用`socket()`函数创建了一个`PF_INET`类型的Socket,即基于IPv4协议的Socket。如果创建失败,返回-1。 3. 调用`bzero()`函数将`servadd`结构体变量的内存清零。 4. 调用`gethostbyname()`函数获取指定主机名的IP地址信息。如果获取失败,返回-1。 5. 将获取到的IP地址信息拷贝到`servadd`结构体变量的`s_addr`成员中。 6. 设置`servadd`结构体变量的属性,包括IP地址、端口号和协议族类型。 7. 调用`connect()`函数连接Socket到指定的服务器。如果连接失败,返回-1。 8. 返回`sock`变量作为函数的返回值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值