Linux网络编程一(协议、TCP协议、UDP、socket编程、TCP服务器端及客户端)

文章目录

      • 协议
        • 1、分层模型结构
        • 2、网络应用程序设计模式
        • 3、ARP协议
        • 4、IP协议
        • 5、UDP协议
        • 6、TCP协议
      • Socket编程
        • 1、网络套接字(socket)
        • 2、网络字节序
        • 3、IP地址转换
        • 4、一系列函数
        • 5、TCP通信流程分析

第二次更新,自己再重新梳理一遍…

协议

协议:指一组规则,数据传输和数据解释的规则。

1、分层模型结构

1、OSI七层模型:物、数、网、传、会、表、应
2、TCP/IP 4层模型:应、传、网、网(链路层)、
用户应用层 http(超文本传输协议,以明文方式发送内容,没有任何加密)、https(提供网络连接的加密,客服端输入的数据放入盒子中加锁后由服务器端接收后解锁)、ftp、nfs、ssh(一种加密传输协议,通过命令行界面远程登录和操作计算机)、telnet
内核传输层 TCP、UDP 捆绑端口号 ③ 网络层 IP、ICMP 传输ip地址 ④链路层 以太网帧协议、ARP

2、网络应用程序设计模式

1、c/s模型
client-server(客户端服务器模型):网游
优点:缓存大量数据、协议选择灵活、速度快、
缺点:安全性低、跨平台难、开发工作量大
2、 b/s模型
browser-server(浏览器服务器模型): 百度网站
优点:安全性高、跨平台、开发工作量较小
缺点:不能缓存大量数据、严格遵守http协议
网络传输流程:数据没有封装之前,是不能再网络中传递的。数据->应用层->传输层->网络层->链路层,以此进入网络环境。

3、ARP协议

根据IP地址获取mac地址,mac地址指的是以太网或者物理地址,例如:比如 00:1B:44:11:3A:B7。
以太网帧协议:根据mac地址,完成数据包传输。

4、IP协议

1、版本:IPv4、IPv6 4位。
2、TTL:下一跳,设置数据包在路由节点中的跳转上限。每经过一个路由节点,该值减1,减为0的路由,有义务将该数据包丢弃。
3、源IP:32位对应4字节,32位二进制代码,每个位置8位,如:192.168.1.108,点分十进制 IP地址(string)。
4、目的IP:32位对应4字节,Ip地址共4字节,每个字段上限255。
5、IP地址:可以在网络环境中,唯一标识一台主机(特定设备)。(家庭住址)
6、端口号:可以在网络的一台主机上,唯一标识一个进程(特定应用程序)。
7、ip地址+端口号:可以在网络环境中,唯一标识一个进程。准确定位网络上的特定设备上的特定应用程序

5、UDP协议

用户数据报协议(User Datagram Protocol),IP负责把数据包送到正确的计算机中,UDP负责把数据包送到正确的程序,UDP不提供数据修复和重发的机制,且无法知道数据包是否送达,数据的确实不重要但是快!如:适用于游戏。
端口:操作系统与外部进行交互使用。
①公认端口:1~1023,用于一些系统内置或知名程序的预留使用,如SSH服务的22端口
②注册端口:1024~49151,随意使用,用于松散的绑定一些程序/服务。
③动态端口:49152~65535,临时使用 不会固定绑定程序,用于程序对外进行网络链接时 (多用于出口)。
16位源端口号,2^16 = 65536 。16位:目的端口号,如:微信端口号是8080,则送入到微信程序中。

6、TCP协议

TCP(Transmission Control Protocol,传输控制协议),它位于网络协议栈的传输层,负责在通信的两个应用程序之间提供可靠的、面向连接的数据传输服务。
数据包有序号,TCP发送数据包时,需要接收方收到后给发送方发确认码。TCP可以处理乱序和丢失数据包重发,根据拥挤情况,自动调整传输率。最大的缺点是数据量大,要发确认码,浪费传输时间。
16位源端口号 2^16 = 65536;16位目的端口号;32序号;32确认序号; 6个标志位;16位窗口大小

Socket编程

1、网络套接字(socket)

*网络套接字(socket): Linux特殊文件类型(管道、套接字、字符设备、块设备)。
一个文件描述符fd指向一个套接字(该套接字内部由内核借助两个读、写缓冲区实现,在网络通信过程中,套接字一定是成对出现的。
套接字(socket)通信原理图如下:
在这里插入图片描述

2、网络字节序

网络字节序:通信时需要进行网络字节序和主机字节序的转换
小端法(pc本地存储),高位存高地址, 低位存低地址,int a = 0x12345678
大端法(网络存储),高位存低地址, 低位存高地址
htonl:本地转到网络(IP)。费劲!看下面的IP地址转换
htons:本地转网络(port端口)
ntohl:网络转本地(IP)
ntohs:网络转本地(Port)

3、IP地址转换

IP地址转换
int inet_pton(int af, const char *src, void *dst);将本地字节序(string IP)—>网络字节序,客户端连接时使用。

const char* inet_ntop(int af, const void *src, char *dst, socklen_t size);
网络字节序—>本地字节序(string IP),从网络中得到,accept传出时使用。

sockaddr地址结构(过时)
IP +port:在网络环境中唯一标识一个进程
struct sockaddr_in addr。作用:用来捆绑IP、端口号
sockaddr_in结构体成员
1、addr.sin_family = AF_INET/ AF_INET6/ AF_UNIX
2、addr.sin_port = htons(9527)
3、addr.sin_addr.s_addr = dst
int dst;inet_pton(AF_INET, “192.157.22.45”, (void *)&dst)
3、addr.sin_addr.s_addr = htonl(INADDR_ANY)
取出当前系统中有效的任意IP地址,二进制类型。INADDR_ANY这个宏表示本地的任意的有效IP地址

4、一系列函数

socket函数:创建一个 套接字伪文件
int socket(int domain, int type, int protocol)

bind函数:给socket绑定一个 地址结构(IP+port)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

listen函数:设置同时与服务器建立连接的上限数(同时进行三次握手的客户端数量)
int listen(int sockfd, int backlog);

accept函数:阻塞等待客户端建立连接。成功即返回一个与客户端成功连接的socket新文件描述符
int accept(int sockfd, struct sockaddr * addr, socklen_t *addrlen);

caonnect函数:使用现有的 socket 与服务器建立连接
int connect(int sockfd, const struct sockaddr * addr, socklen_t addrlen);

5、TCP通信流程分析

server服务器端
1、socket() 创建socket
2、bind()绑定服务器地址结构
3、listen()设置监听上限
4、accept() 阻塞监听客户端连接
5、read(fd)读socket获取客户端数据
6、小—大写 toupper()
7、write(fd)
8、close()
client客户端
使用 nc IP地址 端口号,可以直接测试服务器端
1、socket() 创建socket
2、connect()与服务器建立连接
3、write()写数据到 socket
4、read()读转换后的数据
5、显示读取结果
6、close()
在这里插入图片描述
server服务器端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>#define SERV_PORT 9527void sys_err(char* str)
{perror(str);exit(-1);
}int main(int argc, char* argv[])
{int lfd = 0;									//新套接字所对应的文件描述符int cfd = 0;									//建立连接通信的文件描述符int ret;char buf[BUFSIZ], client_IP[1024];			    //BUFSIZ 宏值默认为4096struct sockaddr_in serv_addr;					//服务端地址serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);	//这个宏表示本地的任意的有效IP地址struct sockaddr_in clit_addr;					//客户端地址socklen_t clit_addr_len;lfd = socket(AF_INET, SOCK_STREAM, 0);		    //创建套接字 IPV4 TCP协议if (lfd == -1) {sys_err("socket error");}//给socket绑定一个 地址结构(IP+port)bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));listen(lfd, 128);//阻塞等待客户端建立连接。成功即返回一个与客户端成功连接的socket新文件描述符clit_addr_len = sizeof(clit_addr);cfd = accept(lfd, (struct sockaddr*)&clit_addr, &clit_addr_len);if (cfd == -1) {sys_err("accept error");}//addr: 传出参数。成功与服务器建立连接的那个客户端的地址结构(IP+port) 需要网络转本地printf("client ip:%s  port:%d\n", inet_ntop(AF_INET, &clit_addr.sin_addr.s_addr, client_IP, sizeof(client_IP)),ntohs(clit_addr.sin_port));while (1) {ret = read(cfd, buf, sizeof(buf));write(STDOUT_FILENO, buf, ret);					//打印输出小写for (int i = 0; i < ret; i++) {buf[i] = toupper(buf[i]);					//小写转大写}write(cfd, buf, ret);							//写回客户端}close(lfd);close(cfd);return 0;
}

client客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>#define SERV_PORT 9527void sys_err(char* str)
{perror(str);exit(-1);
}int main(int argc, char* argv[])
{int cfd;int conter = 10;char buf[BUFSIZ];struct sockaddr_in serv_addr;				//服务器地址结构serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr.s_addr);//serv_addr.sin_addr.s_addr = 				//需要写服务器IPcfd = socket(AF_INET, SOCK_STREAM, 0);if (cfd == -1) {sys_err("socket error");}//使用现有的 socket 与服务器建立连接int ret = connect(cfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));if (ret == -1) {sys_err("connect error");}while (--conter) {write(cfd, "hello\n", 6);sleep(1);ret = read(cfd, buf, sizeof(buf));write(STDOUT_FILENO, buf, ret);}close(cfd);return 0;
}

输出结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/788693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka架构概述

Kafka的体系结构 Kafka是由Apache软件基金会管理的一个开源的分布式数据流处理平台。Kafka具有支持消息的发布/订阅模式、高吞吐量与低延迟、持久化、支持水平扩展、高可用性等特点。可以将Kafka应用于大数据实时处理、高性能数据管道、流分析、数据集成和关键任务应用等场景。…

20240402—Qt如何通过动态属性设置按钮样式?

前言 正文 1、点击UI文件 2、选择Bool型或是QString 3、设置后这里出现动态属性 4、这qss文件中绑定该动态属性 QPushButton[PopBlueBtn"PopBlueBtn"]{background-color:#1050B7;color:#FFFFFF;font-size:20px;font-family:Source Han Sans CN;//思源黑体 CNbor…

【JavaEE初阶系列】——一万字带你了解 JUC常见类 以及 线程安全集合类(哈希表)

目录 &#x1f6a9;JUC(java.util.concurrent) 的常见类 &#x1f388;Callable 接口 &#x1f308;理解 Callable(相关面试题) &#x1f308;理解 FutureTask &#x1f4dd;线程创建方式 &#x1f388; ReentrantLock可重入锁 &#x1f308;ReentrantLock 优势&#x…

4.2日java总结,以及窗口的创建

今日份学习——字符串的进阶 1.StringBulider StringBulider是一个java里的关键字&#xff0c;可以看做一个容器&#xff0c;但是其是一个可以改变的容器&#xff0c;对其有四种操作可以进行&#xff0c;分别是添加元素&#xff08;append&#xff09;&#xff0c;反转元素&a…

谷粒商城实战(009 缓存-分布式锁)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第158p-第p165的内容 分布式锁 原理和使用 使用下shell对产生的命令进行发送 查看 -> 撰写 -> 撰写栏 idea 选中的代码提取成方法 加锁…

【教学类-09-07】20240401细线迷宫图02+箭头图片(A4横版一页-2份竖版)

作品展示 作品展示 word模板 重点说明 代码展示 批量制作细线条的迷宫图(A4横板一面2张竖版)箭头图片 作者&#xff1a; 1、落难Coder https://blog.csdn.net/u014297502/article/details/124839912 2、AI对话大师 3、阿夏 作者&#xff1a;2024年4月3日 numint(input(几人&…

Android14之BpBinder构造函数Handle拆解(二百零四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Docker:探索容器化技术,重塑云计算时代应用交付与管理

一&#xff0c;引言 在云计算时代&#xff0c;随着开发者逐步将应用迁移至云端以减轻硬件管理负担&#xff0c;软件配置与环境一致性问题日益凸显。Docker的横空出世&#xff0c;恰好为软件开发者带来了全新的解决方案&#xff0c;它革新了软件的打包、分发和管理方式&#xff…

AIGC之gradio系列学习教程(一)

主题:本篇即为入门,后续将会从函数和使用场景介绍。 Gradio 是一个开源 Python 包,可让快速为机器学习模型、API 或任何任意 Python 函数构建演示或 Web 应用程序。然后,您可以使用 Gradio 的内置共享功能在短短几秒钟内共享演示或 Web 应用程序的链接。无需 JavaScript、…

C#中值类型与引用类型的存储

目录 值对象与引用对象的存储 引用对象的成员存储 值对象与引用对象的存储 数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象在内存中的存储位置——栈或堆。 C#中类型分为两种&#xff1a;值类型和引用类型&#xff0c;这两种类型的对象…

【蓝桥杯 C++高级组省赛以及2020年-蓝桥杯C++省赛合集+部分答案】

一、选择题&#xff08;单项选择&#xff0c;每空30分&#xff09; 请将选择题答案填入答题卡蓝色框内 第一题&#xff08;难度系数 1&#xff09; 结构化程序所要求的基本结构不包括( )。 A.顺序结构 B.GOTO()跳转 C.选择(分支)结构 D.重复(循环)结构 第二题&#xff…

银行监管报送系统介绍(十五):金融审计平台

《“十四五”国家审计工作发展规划》中重点强调&#xff0c;金融审计&#xff1a;以防范化解重大风险、促进金融服务实体经济&#xff0c;推动深化金融供给侧结构性改革、建立安全高效的现代金融体系为目标&#xff0c;加强对金融监管部门、金融机构和金融市场运行的审计。 —…

面试题:MySQL 事务 日志 MVCC

事务的特性 ACID 事务的隔离级别 并发事务问题 脏读&#xff1a;一个事务读到另一个事务还没有提交的数据不可重复读&#xff1a;一个事务先后读取同一条记录&#xff0c;但两次读取的数据不同幻读&#xff1a;一个事务按照条件查询数据时&#xff0c;没有对应的数据行&#xf…

Oracle EBS AR接口和OM销售订单单价为空数据修复

最近,用户使用客制化Web ADI 批量导入销售订单行功能,把销售订单行的单价更新成空值,直到发运确认以后,财务与客户对帐才发现大量销售订单的单价空,同时我们检查AR接口发现销售订单的单价和金额均为空。 前提条件 采用PAC成本方式具体问题症状 销售订单行的单价为空 Path:…

Redhat 7.9 安装dm8配置文档

Redhat 7.9 安装dm8配置文档 一 创建用户 groupadd -g 12349 dinstall useradd -u 12345 -g dinstall -m -d /home/dmdba -s /bin/bash dmdba passwd dmdba二 创建目录 mkdir /dm8 chown -R dmdba:dinstall /dm8三 配置/etc/security/limits.conf dmdba soft nproc 163…

在CentOS 7上安装Python 3.7.7

文章目录 一、实战步骤1. 安装编译工具2. 下载Python 3.7.7安装包3. 上传Python 3.7.7安装包4. 解压缩安装包5. 切换目录并编译安装6. 配置Python环境变量7. 使配置生效8. 验证安装是否成功 二、实战总结 一、实战步骤 1. 安装编译工具 在终端中执行以下命令 yum -y groupin…

XRDP登录ubuntu桌面闪退问题

修改 /etc/xrdp/startwm.sh unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR . $HOME/.profile

javascript常见的事件属性

焦点事件 focus/blur <input type"text" /><script>const input document.querySelector("input")// 绑定焦点事件input.addEventListener("focus" ,function(){console.log("有焦点触发")})// 失去焦点事件input.addEve…

Git分支提交时自动大写 fatal: the remote end hung up unexpectedly

先说结论&#xff1a; 进入 .git/refs/heads目录&#xff0c;会看到Feature文件夹&#xff0c;重命名为feature即可。 表现&#xff1a; 通过终端命令创建的分支 git checkout -b feature/name 使用git push后自动变成了Feature/name 并且有时候在本地创建feature/1234567…

CSS面试题常用知识day03

大家好我是没钱的君子下流坯&#xff0c;用自己的话解释自己的知识 前端行业下坡路&#xff0c;甚至可说前端已死&#xff0c;我还想在前段行业在干下去&#xff0c;所以从新开始储备自己的知识。 从CSS——>Javascript——>VUE2——>Vuex、VueRouter、webpack——>…