分配给套接字的IP地址和端口号

IP是为收发网络数据而分配个计算机的值,用来在网络中辨认主机

端口号是为区分程序中创建的套接字而分配个套接字的序号,用来在主机中辨认程序

网络地址

1

IPv4标准的4字节IP地址分为 网络地址主机地址

1

1

“向网络传输数据”实际上是 向构成网络的路由器或交换机传递数据,由接收数据的路由器根据数据中的主机地址向目标主机传递数据

网络地址分类与主机地址边界

1

用于区分套接字的端口号

计算机中一般有NIC(Network Interface Card,网络接口卡)数据传输设备

通过NIC向计算机内部传输数据需要用到IP,操作系统根据NIC接收到的数据内的端口号,将数据转发到对应的套接字

1

端口号由 16位 组成,可分配的范围是 0-655350-1023是知名端口,一般分配给特定应用程序

同一协议内端口号唯一,TCP 协议和 UDP 协议可以共用相同的端口号

地址信息的表示

表示IPv4地址的结构体

1

1

  • sin_family:每种协议族适用的地址族均不同

    1

  • sin_port: 16位端口号,以 网络字节序 保存

  • sin_addr: 32位IP地址信息,以 网络字节序 保存

  • sin_zero:用作填充,不使用

上述的所展示的是IPv4地址的结构体,但是 socket api 并不只支持IPv4,所以 struct sockaddr_in 在传递给函数时,一般都是先要转换成 struct sockaddr

struct sockaddr {
  sa_family_t sin_family;
  char sa_data[14];
};

这也解释了为什么需要填充字节 char sin_zero[8]

网络字节序与地址的变换

字节序

1

网络字节序就是大端序

字节序转换

1

数据在传输之前会自动转换为网络字节序,我们只需在填充 struct sockaddr_in 时考虑字节序即可

网络地址的初始化和分配

将字符串信息转换为网络字节序整数型

1

1

1

inet_ntoa 函数返回的是 char *,说明字符串已经被保存到内存空间,我们应该立即将他复制到其他内存空间,避免再次调用 inet_ntoa 覆盖之前保存的字符串信息

网络地址初始化

1

使用 INADDR_ANY 会自动获取本机的所有IP地址(与NIC网卡数量有关),简单来说,就是只要是绑定的端口号过来的数据,都可以接收到,无需指定特定的IP地址

1

向套接字分配网络地址

1

1

 posted on 2025-06-17 11:25  Dylaris  阅读(29)  评论(0)    收藏  举报