当前位置:首页>java>Linux网络编程,这篇文章能够帮助你

Linux网络编程,这篇文章能够帮助你

  • 2026-10-24 06:41:19
Linux网络编程,这篇文章能够帮助你
网络编程是应用层中非常重要的一门课,所以它的学习就变得格外的重要。它是基于网络实现跨主机编程,达到局域网内各主机进程间通信。
要想学习网络编程,我们就先要认识网络
什么是网络:
网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。
网络是由什么构成的:

IP地址

网关

子网掩码

DNS域名

什么是IP地址

IP地址:局域网内的身份证
两个格式:
PV4:点分十进制:192.168.50.xx
网络二进制:32位长度
IPV6:点分十进制:16字节
网络二进制:128位长度
两个版本:IPV4,IPV6

IPV4地址分类

(适用于大型网络)A类:(以0开头)
1个字节的网络地址 ,3个字节的主机地址
网络二进制:0000 0000 0000 0000 0000 0000 0000 0001   - 0111 1111 1111 1111 1111 1111 1111 1110
点分十进制: 0.0.0.1 -- 127.255.255.254
注意:IP中有两个地址不能用:
地址全为0的  :网络ID号
地址全为1的  :广播地址
(适用于中型网络)  B类:(以10开头)
2个字节的网络地址,2个字节的主机地址
网络二进制:1000 0000 0000 0000 0000 0000 0000 0001   - 1011 1111 1111 1111 1111 1111 1111 1110
点分十进制: 128.0.0.1 -- 191.255.255.254
(适用于小型网络)  C类:(以110开头)
3个字节的网络地址,1个字节的主机地址
网络二进制:1100 0000 0000 0000 0000 0000 0000 0001   - 1101 1111 1111 1111 1111 1111 1111 1110
点分十进制: 192.0.0.1
(组播地址)  D类:(以1110开头)
4个字节的网络地址,0个字节的主机地址
网络二进制:1110 0000 0000 0000 0000 0000 0000 0001   - 1110 1111 1111 1111 1111 1111 1111 1110
点分十进制: 224.0.0.1 -- 239.255.255.254
(保留地址)  E类:(以11110开头)
网关:取值:1-254之间,如果没有指定某个,则随机挑选一个
用来管理网段下所有的计算机信息的发送和接收
网关
网关的取值是1~254之间,若无指定,则由系统随机挑选用来管理网络
子网掩码:
网络地址全为1,主机地址为0

DNS域名解析

推断你是使用哪个地方的什么网络,用来解释某个域名的真实地址

协议

是保护双方通信的规则,规范双方的通信

OSI架构

7层 5层 四层
应用层 应用层 应用层 HTTP/POP3
表示层· 传输层 传输层 TCP/UDP
会话层 网络层 网络层 IP
传输层 数据链路层 物理层 网线
网络层 物理层
数据链路层
物理层

为什么采用协议

目的:将数据一步一步打包成为网络帧,然后进行发送
网络帧:类似json,是为了避免系统之间的字节长长度,导致数据混乱。

TCP/UDP协议

TCP:发送数据的时候需要链接,数据稳定发送,不易丢包
UDP:无需连接,数据直接发送,容易丢包

TCP建立连接(三次握手)

这里需要注意几个标识符,分别是:ACK(确认标识),URG(紧急标识),PSH(推标识),FIN(断开标识),SYN(请求标识)。

TCP编程

TCP服务器编程 TCP客户端编程
  1. 建立socket连接 建立socket连接 买手机
  2. 绑定IP和端口号 连接服务器 打电话给服务器
  3. 监听 发/收
  4. 等待连接
  5. 收/发
开始编程,先对服务器进行操作 步骤如下
1>建立socket连接---创建一个具有网络属性的文件描述符
函数原型如下
功能:  创建一个具有网络属性的文件描述符  产生socket套接字
int socket(int domain, int type, int protocol);参数: domain:地址族:          type:协议:   protocol:参数生效值         默认为0 --- 代表前两个参数生效返回值:成功返回套接字文件描述符,失败返回-1             

测试图片如下

2>绑定IP和端口号   -----  全课程最长最难部分
bind
函数原型如下
intbind(int sockfd, conststruct sockaddr *addr,socklen_t addrlen); 功能: 给sockfd绑定IP和端口号 参数: sockfd addr:结构体指针,是需要用来赋值的 addrlen:addr的长度 返回值: 成功返回0 失败返回-1,并设置错误码
该结构体不适用:1>sa_date长度为14字节   IP和端口号合共6个字节
2>多出来8字节空位 无法填充
3>无法判断赋值顺序  IP 在前?   端口号在前?
因为自带的结构体不合适,所以引入了 struct sockaddr_in
原型如下
struct sockaddr_in{sa_family_t   sin_family;   //地址族   2个字节uint16_t      sin_port;     //端口号 2个字节  ---16位struct in_addr    sin_addr;  //32位IP地址 4个字节char     sin_zero;      //填充字节 8个字节};16个字节struct in_addr{IPv4地址赋值专用结构体In_addr_t  s_addr;    //32位IPv4地址};
也可以使用自动获取IP地址的命令,他就是server.sin_addr.s_addr = INADDR_ANY
在进行赋值的时候需要注意,因为Linux使用的是小端序,网络使用的是大端序,所以需要对端序进行改变
调用,注意使用的时候看好位数的多少,此处是16位,所以使用的是htons
函数原型如下
uint32_thtonl(uint32_t hostlong);   针对32位转换    uint16_thtons(uint16_t hostshort);  针对16位转换                uint32_tntohl(uint32_t netlong);     uint16_tntohs(uint16_t netshort);  前两个:小端序转大端序               后两个:大端序转小端序这里需要注意,系统并不会直接读取我们输入的IP地址,这个时候就需要一个函数来对其进行转换。in_addr_tinet_addr(constchar *cp);     、功能:              点分十进制转化为网络二进制                  参数:              cp:点分十进制地址                   返回值:              成功返回网络二进制地址                                   失败返回INADDR_NONE
这个函数就能够大大便利我们的使用。
绑定成功

监听

为了能够更好的测试监听,这个时候就需要写用户端的函数了
#include/* See NOTES */#includeintlisten(int sockfd, int backlog);功能: 监听参数: sockfd backlog:允许服务器一瞬间最大连接数返回值: 成功返回0 失败返回-1,并设置错误码//绑定成功之后,就能够进行下一步了,下一步是监听  /*   if(listen(sockfd, int 30))      {         perror("listen");          exit(-1);      } */监听写好之后,下一个就是写等待连接intaccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);         功能:                  阻塞等待客户端连接                           参数:                  sockfd                   addr:struct sockaddr * --->保存客户端的IP和端口号                 addlen:addr的长度                          返回值:                  成功返回客户端的文件描述符                  失败返回-1,并设置错误码

最新文章

随机文章