struct sockaddr //通用套接字地址结构,定义在头文件中;
{
uint8_t sa_len;
sa_family_t sa_family; //协议组,比如AF_XXX等;
char sa_data[14]; //协议地址,14个字节;
};
sa_family一般为AF_INET,AF表示ADDRESS FAMILY,是地址族的意思。一般情况下#define AF_INET 0,sa_data则包含该socket的IP地址和端口号。不过这个套接字地址结构用的比较少,通常情况下,都是用下面一个。
struct sockaddr_in //sockaddr_in定义在头文件中;
{
uint8_t sin_len;
sa_family_t sin_family; //协议类型,同struct sockaddr中的sa_family;
in_port_t sin_port; //端口号;
struct in_addr sin_addr; //地址
char sin_zero[8]; //这个是为了达到使套接字地址结构达到16个字节;
} ;
sockaddr_in和sockaddr是并列的结构,可以相互转化。一般使用sockaddr_in建立套接字,然后使用struct sockaddr*可以进行强制转化,比如定义一个struct sockaddr_in a;那么(struct sockaddr*)a就把这个套接字的类型进行了强制转化。
另外,struct in_addr的定义是:
struct in_addr
{
in_addr_t s_addr; //表示32位的网络地址,如0xC0A80001(点分制表示就是192.168.0.1)。
};
下面举例定义一个套接字地址结构:
#define LOCAL_PORT 6666
#define LOCAL_IP 192.168.0.1
struct sockaddr_in my_example;
bzero(&my_example,sizeof(my_example)); //初始化
my_example.sin_family=AF_INET; //协议组,使用的是IPv4
my_example.sin_port=htons(LOCAL_PORT); //转换成网络字节序的端口
my_example.sin_addr.s_addr=inet_addr("LOCAL_IP"); //把字符串形式的ip转换成网络字节序
...
阅读(1301) | 评论(0) | 转发(0) |