TCP/IP 网络编程 第三章

IP地址和端口号

IPV4:4字节地址族
IPV6:16字节地址族
在这里插入图片描述
在这里插入图片描述
先查询网络地址,再查询主机地址。
A类地址的首字节范围: 0–127,A类地址的首位以0开始
B类地址的首字节范围: 128–191 ,B类地址的前2位以10开始
C类地址的首字节范围: 192–223 ,C类地址的前3位以110开始
端口号:可分配0~65535,但0~1023是知名端口。
UDPTCP可以用同一个端口号,因为他们不共用。

地址信息的表示

struct sockaddr_in{
	sa_family_t sin_family;//地址族
	uint16_t sin_port;//16位TCP/UDP端口号
	struct in_addr sin_addr;//32位IP地址。
}
struct in_addr{
	in_addr_t s_addr;//32位IP地址。
}

在这里插入图片描述
成员sin_family:
在这里插入图片描述
成员sin_port:
保存端口号,并且是以网络字节序保存的。
成员sin_addr:
保存32IP地址,也是以网络字节序保存的。
成员sin_zero:
为了大小和sockaddr保持一致。

bind(serv_sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr)),期待的是sockaddr结构体,但是它长这样:

struct sockaddr{
	sa_family sin_family;
	char sa_data[14];//地址信息:IP+端口号
}

为了方便我们直接转换就可以了。

网络字节序和地址变换

cpu2种方式解析数据,大端序、小端序(高位字节放到低/高位地址),传输的时候都转换成大端序。
在这里插入图片描述
字符串信息(127.0.0.1)转换成网络字节序:
in_addr_ t inet_addr(const char * string);,成功返回32位大端序整数型值,失败时返回INADDR_NONE.
或者使用int inet_aton(const char * string,struct in_addr * addr);,成功返回1,失败返回0,自动传进结构体里。
反向操作:char* inet_ntoa(struct in_addr adr);,网络字节序转IP地址。但是会用到同一块空间,所以需要把内容复制出来。

网络地址信息初始化

在这里插入图片描述
每次创建服务端套接字会有点繁琐,直接使用htonl(INADDR_ANY),自动分配服务器的IP地址(常数),对于多宿主(多个IP)也会比较方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值