套接字的域和地址族
今天,说一下套接字的域和地址族。前面linux的套接口和管道已经说到domain这个参数了,这个参数可以使AF_LOCAL.AF_LOCAL的前缀AF_表示地址族(address family),domain参数就是在选择到底使用哪个地址族。
通用套接字地址的结构:
struct sockaddr { sa_family_t sa_family;//地址族 char sa_data[14];//地址数据 };
其中sa_family_t是一个无符号的短整数。整个数据占16个字节。
我们常见的domain参数一般是AF_INET(IPv4),AF_INET6(IPv6)。AF_INET的结构格式为:
#include <netinet/in.h> struct sockaddr_in { sa_family_t sin_family;//地址族 uint16_t sin_port;//端口号 struct in_addr sin_addr;//Inernet地址 unsigned char sin_zero[8];//占位字节 };
说到网络字节问题,就需要考虑到网络字节序。因为字节序有些系统是不同的。为了实现大端/小端字节序之间的转换,系统提供了几个转换函数:
#include <netinet/in.h> unsigned long htonl(unsigned long hostlong); unsigned short htons(unsigned short hostshort); unsigned long ntohl(unsigend long netlong); unsigned short ntohs(unsigned short netshort);
有了前面的介绍,可以开始初始化Internet地址了。下面的例子使用了到了socket()和bind()函数。
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <netinet/in.h> //error,用于输出错误 static void bail(const char *on_what) { perror(on_what); exit(1); } int main() { int sck_inet = socket(AF_INET,SOCK_STREAM,0);//套接口,套接字 if (sck_inet == -1) { bail("sock()"); } struct sockaddr_in adr_inet;//IPv4地址结构 memset(&adr_inet,0,sizeof adr_inet); adr_inet.sin_family = AF_INET; adr_inet.sin_port = htons(8081); const unsigned char IPno[] = {127,0,0,23}; memcpy(&adr_inet.sin_addr.s_addr,IPno,4); int len_inet = sizeof adr_inet; int z = bind(sck_inet, (struct sockaddr*)&adr_inet,len_inet);//绑定套接字和ip地址 if (z == -1) { bail("bind()"); } system("netstat -pa --tcp 2>/dev/null | " "sed -n '1,/^Proto/p;/af_inet/p' "); close(sck_inet); return 0; }
今天的套接字就介绍到这,下一篇要介绍的是地址转换函数
作者:涵曦(www.hanxi.cc)
出处:hanxi.cnblogs.com
GitHub:github.com/hanxi
Email:im.hanxi@gmail.com
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
《 Skynet 游戏服务器开发实战》
-
学习地址:
-
优惠推荐码:
2CZ2UA5u
-
可以先免费试学前 2 章内容