socket编程有两个常用的结构体
struct sockaddr //sockaddr结构体定义,在ws2def.h中
{
unsigned short sa_family;
char sa_data[14];
};
struct sockaddr_in //sockaddr_in结构体定义,在ws2def.h中
{
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8]; //填充字节使sockaddr与sockaddr_in的大小相同
};
struct in_addr
{
uint32_t s_addr;
};
sockaddr 与socketaddr_in对比:
联系:结构体sockaddr与结构sockaddr_in储存空间相同,可以相互转化
区别:sockaddr是给系统用的,而sockaddr_in是给程序员用的,端口地址区分明显
相互转换:两者之间可以强制转化
例:connect(sockfd, (struct sockaddr *) &mysock, sizeof(mysock));//强制转换成struct sockaddr
下面是sockaddr_in结构体的操作举例
//示例:sockaddr_in结构变量的初始化与赋值
int sockfd;
struct sockaddr_in mysock;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
//对socketaddr_in进行赋值
memset(&mysock,0, sizeof(mysock)); //初始化结构体,全置为零,在linux可用bzero()代替
//对socketaddr_in进行赋值
mysock.sin_family = AF_INET; //设置地址家族,使用 IPv4 进行通信(AF_INET值为2)
mysock.sin_port = htons(800); //设置端口,主机字节顺序转换为网络字节顺序
mysock.sin_addr.s_addr = inet_addr("192.168.1.0"); //设置地址,将点分十进制的数转化为二进制的数
//另一种赋值方法:inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
//运行结果呈现
printsockaddr_in(mysock); //sockaddr_in中储存的数据输出
int*str; //以字符串形式输出IP地址
str = inet_ntoa(mysock.sin_addr);
printf("address 1: %s\n", a1);
//sockaddr_in与sockaddr的强制转换
//connect(sockfd, (struct sockaddr *) &mysock, sizeof(mysock)); //强制转换成struct sockaddr
void printsockaddr_in(struct sockaddr_in temp)
{
//sockaddr_in结构体输出函数
printf("family:%u\n", temp.sin_family);
printf("port:%u\n", temp.sin_port);
printf("addr:%u\n", temp.sin_addr);
printf("zero:%s\n", temp.sin_zero);
}
运行结果: