linux网络编程之sockaddr与sockaddr_in

一、sockaddr

sockaddr
	struct sockaddr {
	unsigned  short  sa_family;  /*address family, AF_xxx */
	char  sa_data[14];      /* 14 bytes of protocol address */
};

sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET,。
sa_data是14字节协议地址。
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。

但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构sockaddr_in。

二、sockaddr_in

sockaddr_in(在netinet/in.h中定义):
struct  sockaddr_in {
	short  int  sin_family;     /* Address family */
	unsigned  short  int  sin_port;  /* Port number */
	struct  in_addr  sin_addr;      /* Internet address */
	unsigned  char  sin_zero[8]; /*Same size as struct sockaddr*/
};

struct  in_addr {
	unsigned  long  s_addr;
};

typedef struct in_addr {
union {
	struct{
		unsigned char s_b1,
					  s_b2, 
					  s_b3,
					  s_b4;
       } S_un_b;
       
 	struct {
        unsigned short s_w1,
                       s_w2;
            } S_un_w;
            unsigned long S_addr;
          } S_un;
} IN_ADDR;

sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,在最后用进行类型转换就可以如下:

struct sockaddr_in se_addr;
se_addr.sin_family=AF_INET;  //set net agreement	
se_addr.sin_addr.s_addr=INADDR_ANY; //set to accpet any ip
se_addr.sin_port=htons(9990);// set ip port
inet_aton("127.0.0.1",&se_addr.sin_addr);//transform type of ip
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉迷学习的拿铁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值