当前位置: 首页 > news >正文

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;
}

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

相关文章:

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

文章目录 协议1、分层模型结构2、网络应用程序设计模式3、ARP协议4、IP协议5、UDP协议6、TCP协议 Socket编程1、网络套接字(socket)2、网络字节序3、IP地址转换4、一系列函数5、TCP通信流程分析 第二次更新&#xff0c;自己再重新梳理一遍… 协议 协议&#xff1a;指一组规则&…...

Python读取Excel根据每行信息生成一个PDF——并自定义添加文本,可用于制作准考证

文章目录 有点小bug的:最终代码(无换行):有换行最终代码无bug根据Excel自动生成PDF,目录结构如上 有点小bug的: # coding=utf-8 import pandas as pd from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter from reportlab.pdfbase import pdf…...

http: server gave HTTP response to HTTPS client 分析一下这个问题如何解决中文告诉我详细的解决方案

这个错误信息表明 Docker 客户端在尝试通过 HTTPS 协议连接到 Docker 仓库时&#xff0c;但是服务器却返回了一个 HTTP 响应。这通常意味着 Docker 仓库没有正确配置为使用 HTTPS&#xff0c;或者客户端没有正确配置以信任仓库的 SSL 证书。以下是几种可能的解决方案&#xff1…...

Flume学习笔记

视频地址:https://www.bilibili.com/video/BV1wf4y1G7EQ/ 定义 Flume是一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。 Flume高最要的作用就是实时读取服务器本地磁盘的数据,将数据写入HDFS。 官网:https://flume.apache.org/releases/content/1.9.0/…...

数据库系统概论(超详解!!!) 第三节 关系数据库标准语言SQL(Ⅳ)

1.集合查询 集合操作的种类 并操作UNION 交操作INTERSECT 差操作EXCEPT 参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同 查询计算机科学系的学生及年龄不大于19岁的学生。SELECT *FROM StudentWHERE Sdept CSUNIONSELECT *FROM StudentWHERE Sage&l…...

与谷歌“分家”两年后,SandboxAQ推出统一加密管理平台

3月27日&#xff0c;SandboxAQ宣布其AQtive Guard平台现已全面可用&#xff08;GA&#xff09;&#xff0c;适用于所有行业&#xff0c;以防范人工智能驱动和量子攻击的威胁。前者是在两年前3月从谷歌母公司Alphabet分拆出来的初创公司&#xff0c;并在当时获得了“九位数”的融…...

【卫星家族】 | 高分六号卫星影像及获取

1. 卫星简介 高分六号卫星&#xff08;GF-6&#xff09;于2018年6月2日在酒泉卫星发射中心成功发射&#xff0c;是高分专项中的一颗低轨光学遥感卫星&#xff0c;也是我国首颗精准农业观测的高分卫星&#xff0c;具有高分辨率、宽覆盖、高质量成像、高效能成像、国产化率高等特…...

XML与Xpath

XML与Xpath XML是一种具有某种层次结构的文件&#xff0c;Xpath则是解析这种文件的工具 接下来将会解释XML文件的结构和Xpath的基本使用&#xff0c;并且用Java语言进行操作展示。 XML结构 XML&#xff08;可扩展标记语言&#xff09;文件具有一种层次结构&#xff0c;由标签…...

【c++20】CPP-20-STL-Cookbook 学习笔记

Cpp20-STL-Cookbook-src简单的阅读笔记。c++20更好用了,比如STL 包含了一些这样的辅助函数,比如 make_pair() 和make_tuple() 等。 这些代码现在已经过时了,但是为了与旧代码兼容,会保留这些代码。比如 可以声明是一个std的string:Sum s1 {1u, 2.0, 3, 4.0f }?...

Python 之 Flask 框架学习

毕业那会使用过这个轻量级的框架&#xff0c;最近再来回看一下&#xff0c;依赖相关的就不多说了&#xff0c;直接从例子开始。下面示例中的 html 模板&#xff0c;千万记得要放到 templates 目录下。 Flask基础示例 hello world from flask import Flask, jsonify, url_fora…...

精品丨PowerBI负载测试和容量规划

当选择Power BI作为业务报表平台时&#xff0c;如何判断许可证的选择是否符合业务需求&#xff0c;价格占了主导因素。 Power BI的定价是基于SKU和服务器内核决定的&#xff0c;但是很多IT的负责人都不确定自己公司业务具体需要多少。 不幸的是&#xff0c;Power BI的容量和预期…...

【算法-PID】

算法-PID ■ PID■ 闭环原理■ PID 控制流程■ PID 比例环节&#xff08;Proportion&#xff09;■ PID 积分环节&#xff08;Integral&#xff09;■ PID 微分环节&#xff08;Differential&#xff09; ■ 位置式PID&#xff0c;增量式PID介绍■ 位置式 PID 公式■ 增量式 PI…...

ros rosbag使用记录

rosbag: 1. rosbag record -a 记录当前所有消息&#xff08;较少用&#xff09;2. rosbag record -O bag_name.bag /topic 记录指定消息3. rosbag info 查阅bag文件信息4. rosbag play 播放bag文件内容5. python script 查看bag文件内容参考&#xff1a; 1. rosbag record -a 记…...

WebKit结构揭秘:探秘网页渲染的魔法之源

一、WebKit之心&#xff1a;渲染引擎的魔力 WebKit的渲染引擎是其核心所在&#xff0c;它犹如一位技艺高超的魔法师&#xff0c;将HTML、CSS和JavaScript的魔法咒语转化为绚丽的网页画面。它解析代码&#xff0c;绘制页面&#xff0c;让网页内容跃然屏上&#xff0c;展现出无尽…...

VSCode美化

今天有空收拾了一下VSCode&#xff0c;页面如下&#xff0c;个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多&#xff0c;有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网&#xff1a;Maple-Font 我只安装了下图两个字体&#xff0c;使…...

Runes 生态一周要览 ▣ 2024.3.25-3.31|Runes 协议更新 BTC 减半在即

Runes 生态大事摘要 1、Casey 发布了 Runes 协议文档 RUNES HAVE DOCS&#xff0c;Github 代码库更新到 ord 0.17.0 版本&#xff0c;Casey 表示符文是一个“严肃”的代币协议。 2、Casey 公布了第一个硬编码的创世符文「UNCOMMONGOODS」 3、4月7日香港沙龙&#xff5c;聚焦「…...

瘦身Spring Boot应用(thinJar)

瘦身Spring Boot应用(thinJar) 简介 我们使用Spring Boot提供的spring-boot-maven-plugin打包Spring Boot应用&#xff0c;可以直接获得一个完整的可运行的jar包&#xff0c;把它上传到服务器上再运行就极其方便。 但是这种方式也不是没有缺点。最大的缺点就是包太大了&…...

备战蓝桥杯---贪心刷题1

话不多说&#xff0c;直接看题&#xff1a; 本质是一个数学题&#xff1a; 我们令xi<0表示反方向传递&#xff0c;易得我们就是求每一个xi的绝对值之和min,我们令平均值为a爸。 易得约束条件&#xff1a; x1-x2a1-a,x2-x3a2-a..... 解得x1x1-0,x2x1-((n-1)*a-a2-...an)。…...

《数据结构学习笔记---第九篇》---循环队列的实现

文章目录 1.循环队列的定义 2.循环队列的判空判满 3.创建队列并初始化 4.入队和出队 5. 返回队尾队首元素 6.释放循环队列 1.循环队列的定义 定义&#xff1a;存储队列元素的表从逻辑上被视为一个环。 我们此次实现的循环队列&#xff0c;采用顺序表 typedef struct {int…...

前端调试工具之Chrome Elements、Network、Sources、TimeLine调试

常用的调试工具有Chrome浏览器的调试工具&#xff0c;火狐浏览器的Firebug插件调试工具&#xff0c;IE的开发人员工具等。它们的功能与使用方法大致相似。Chrome浏览器简洁快速&#xff0c;功能强大这里主要介绍Chrome浏览器的调试工具。 打开 Google Chrome 浏览器&#xff0c…...

vue 加 websocket 聊天

<template><div style="height: 100%; width: 100%; background-color: #fff"><div class="wrap"><!-- 头部 --><div class="titleBox"><imgsrc="@/assets/image/avatar.png"style="argin: 10p…...

uniapp通过蓝牙传输数据 (ios)

在uni-app中&#xff0c;可以通过uni-ble&#xff08;uni-app官方提供的蓝牙插件&#xff09;来实现iOS设备上的蓝牙数据传输。 首先&#xff0c;确保已在uni-app的manifest.json文件中添加uni-ble插件的配置&#xff1a; "permission": { "scope.userLocati…...

docker搭建CI/CD环境配置过程中的常见问题

一、Jenkins 1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepo…...

实验四 微信小程序智能手机互联网程序设计(微信程序方向)实验报告

请编写一个用户登录界面&#xff0c;提示输入用户名和密码进行登录&#xff1b; 代码 index.wxml <view class"user"> <form bindreset""> <view>用户名&#xff1a;</view><input type"text"name""/>…...

WPF —— 关键帧动画

wpf动画类型 1<类型>Animation这些动画称为from/to/by动画或者叫基本动画&#xff0c;他们会在起始值或者结束值进行动画处理&#xff0c;常用的例如 <DoubleAnimation> 2 <类型>AnimationUsingKeyFrames: 关键帧动画&#xff0c;功能要比from/to这些动画功…...

Taro + vue3 小程序封装标题组件

分为没有跳转页面的title组件和 有跳转页面的title组件 我们可以把这个封装成一个组件 直接上代码 <template><div class"fixed-title-container"><div class"box"><div class"icon" v-if"isShow" click"…...

babyAGI(6)-babyCoder源码阅读2任务描述部分

废话不多说&#xff0c;我们直接看task的prompt 这里需要注意的是&#xff0c;每个openai_call的temperature都不相同&#xff0c;这也是开发程序时需要调整和关注的一点 1. 初始化代码任务agent 作为babycoder的第一个angent&#xff0c;整个prompt编写的十分值得学习 整个p…...

生成式语言模型预训练阶段验证方式与微调阶段验证方式

生成式语言模型&#xff0c;如GPT-3、BERT等&#xff0c;在预训练和微调阶段都需要进行验证以确保模型性能。下面分别介绍这两个阶段的验证方式&#xff1a; 预训练阶段的验证&#xff1a; 预训练阶段通常使用大量未标注的文本数据来训练模型&#xff0c;以学习语言的一般特性。…...

flink on yarn

前言 Apache Flink&#xff0c;作为大数据处理领域的璀璨明星&#xff0c;以其独特的流处理和批处理一体化模型&#xff0c;成为众多企业和开发者的首选。它不仅能够在处理无界数据流时展现出卓越的实时性能&#xff0c;还能在有界数据批处理上达到高效稳定的效果。本文将简要…...

用TOMCAT部署web项目教程

文章目录 引言I 使用webapps文件夹II 利用server.xmlIII 自定义配置文件IV 预备知识4.1项目的一般结构4.2 contex标签4.3 IDE部署4.4 配置Tomcat服务引言 在开发阶段,一般使用IDE如MyEclipse来部署web项目,不要忘记手动部署的三种方式。 I 使用webapps文件夹 将项目文件夹…...

泊头市做网站/如何推广自己产品

第1关:求图中边或弧的数目 任务描述 本关任务:求给定图中的边(或弧)的数目。 相关知识 实验目的 掌握图的基本概念; 掌握图的存储结构的设计与实现,基本运算的实现; 熟练掌握图的两种遍历算法、遍历生成树及遍历算法的应用。 实验任务 说明:为使实验程序简洁直观,下…...

wordpress主题邮件模板/网络营销的优势包括

当你登录MySQL数据库出现&#xff1a;Error 1045错误时&#xff08;如下&#xff09;&#xff0c;就表明你输入的用户名或密码错误被拒绝访问了&#xff0c;最简单的解决方法就是将MySQL数据库卸载然后重装&#xff0c;但这样的缺点就是就以前的数据库中的信息将丢失&#xff0…...

网站建设推广平台/百度推广客户端电脑版

/*使用PrepareStatement数据批量操作 * update、delete本身就具有批量操作的效果。 * 此时的批量操作&#xff0c;主要指的是批量插入。使用PreparedStatement如何实现更高效的批量插入&#xff1f;* 题目&#xff1a;向goods表中插入20000条数据* CREATE TABLE goods(id INT P…...

日本插画网站有哪些/百度24小时客服电话136

堆 逻辑结构&#xff1a; 1 / \ 1 3 / \ / \ 4  5 6 null 物理结构; 1.首先堆是一个完全二叉查找书&#xff08;Complete Binary Search Tree&#xff09;树&#xff0c;观察一下堆的逻辑结构和物理结构&#xff0c;逻辑结构是一颗完全二…...

做推广自己找网站/最近三天的新闻大事

速度映射图主要是为了得到每个像素相对于前一帧的运动矢量&#xff0c;其中一种方法是使用摄像机的深度纹理来推导。 推导过程如下&#xff1a; 先由深度纹理逆推出NDC&#xff08;归一化的设备坐标&#xff09;下的顶点坐标&#xff0c;利用VP矩阵&#xff08;视角*投影矩阵&a…...

苏州工业园区两学一做教育网站/百度推广入口官网

题目&#xff1a;随便输入一个数 n 作为猴子总数&#xff0c;当数到7的猴子就会被淘汰。 个人感觉写起来有点复杂&#xff0c;但还算比较好理解。。。 首先要明确这样一个道理&#xff0c;从1数到7&#xff0c;每数一轮就会淘汰一只猴子&#xff0c;所以要选出猴王一共要数n-…...