socket编程学习(一)socket结构体简介,初始化及赋值操作

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);
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值