net、udp、tcp

news/2024/9/17 3:05:11/ 标签: udp, tcp/ip, 网络

Makefile的main.c文件中的全局变量SONG song,要在fun.c文件里面写成extern SONG song

编译方法

第一次编写


网络编程 

物理层的网线规定有八根,颜色不一样,功能不一样,光猫把光信号转换成电信号,光纤10Gb

WiFi叫无线局域网,一般也就50米左右,手机流量叫蜂窝网络,随时随地上网。

链路层:先格式化一下,网络可以通过交换机连接起来。

网络层:通过ip地址找到目标

传输层:数据以何种方式传输?tcp可靠传输,传输过程中数据准确的到达对方。udp可能会丢包 。一般下载文件上传文件多以tcp为主,一般视频,音频 (实时性重要)一般用udp

OSI模型

物理层

解决两个硬件之间怎么通信的问题,常见的物理媒介有光纤、电缆、中继器等。它主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。

它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

链路层(把设备连接起来)

在计算机网络中由于各种干扰的存在,物理链路是不可靠的。该层的主要功能就是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。

它的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层的数据叫做帧。

网络

计算机网络中如果有多台计算机,怎么找到要发的那台?如果中间有多个节点,怎么选择路径?这就是路由要做的事。

该层的主要任务就是:通过路由选择算法,为报文(该层的数据单位,由上一层数据打包而来)通过通信子网选择最适当的路径。这一层定义的是IP地址,通过IP地址寻址,所以产生了IP协议。

传输层

当发送大量数据时,很可能会出现丢包的情况,另一台电脑要告诉是否完整接收到全部的包。如果缺了,就告诉丢了哪些包,然后再发一次,直至全部接收为止。

简单来说,传输层的主要功能就是:监控数据传输服务的质量,保证报文的正确传输。

会话层(网络断开,连接的状态)

虽然已经可以实现给正确的计算机,发送正确的封装过后的信息了。但我们总不可能每次都要调用传输层协议去打包,然后再调用IP协议去找路由,所以我们要建立一个自动收发包,自动寻址的功能。于是会话层出现了:它的作用就是建立和管理应用程序之间的通信。

表示层(加密,解密)

表示层负责数据格式的转换,将应用处理的信息转换为适合网络传输的格式,或者将来自下一层的数据转换为上层能处理的格式。

应用层

应用层是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。前端同学对应用层肯定是最熟悉的。

TCP/IP模型(也叫tcp/ip协议栈):专门描述互联网的模型(把OSI模型合并了一下)

TCP/IP协议族

  • dns 域名解析  把域名转成ip地址
  • DHCP 动态主机配置协议(路由器分配地址)
  • http  超文本传输协议(使用网页就会用到这个协议)
  • FTP  互联网远距离传输用ftp(可以断点续传)
  • TFTP 简单文件传输协议(传输本地文件)---局域网内
  • SNMP   网络管理  网络状态监测
  • TCP 传输控制协议   一种可靠的传输方式  自带超时重传   必须要有应答    实时性比较差
  • UDP   实时性好  会丢包   节省网络开销
  • ARP  地址解析协议    在以太网环境中,数据的传输所依懒的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成的。
  • RIP和OSPF都是路由协议

TCP编程基础知识


  • 网关:也叫gate,跟个门一样,没出去就是局域网,出去就是互联网,默认是0.1(后两位)
  • 广播:最后一位是255)给这个位发,所有人都接收到了(只能是局域网里,一个人发所有人收)
  • 组播:让想收到的人收到(类似于群聊)

IP地址一般都是点分十进制(分为四段,每一段最小0最大255)

A类中第一段表示有多少个网络,是网络号,后面的数字表示有多少台主机(2的64次方)

B类中前两段表示有多少个网络(比如说128.0和128.1代表两个网络),后面数字表示有多少台主机(2的16次方)

C类前三段表示有多少个网络,后面数字表示有某一台主机(主机号)------我们一般用的是这种

linux的网络配置命令

配置完一定要重启sudo reboot 才会生效

ifconfig:查看网卡状态相关信息

硬件地址

手动设置ip地址,然后重启

查看网络状态(是否连接)

网络接口

  • socket 套接字  是文件描述符(网络文件需要收发)
  • ip地址是用来找主机的
  • 端口号用来识别进程的

网络字节序

小端存储--数据的低位在低内存

  • 计算机是小端    网络设备是大端
  • ip地址和端口号要去找主机设备--------都要大小端转换一下

UDP(有服务端和客户端,一对多的关系)简单一点----无连接,不显示状态信息,不可靠

  • socket类似于open,将网络设备打开,打开后拿到一个文件描述符
  • 客户端找服务器需要ip地址和端口号,bind就是给套接字设置ip地址和端口号的 
  • 服务器先收,因为客户得先告诉服务器要啥

代码:(客户端找服务器)

固定的就选这个IPv4对应的

服务端: 

SA是强转一下,转成下面这个类型

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);//第一步,可能会有少量丢包,0是默认方式if(-1 == sockfd){perror("socket");exit(1);}// man 7 ip struct sockaddr_in ser,cli;//in代表internet互联网,这个是对方和自己的地址结构体bzero(&ser,sizeof(ser));bzero(&cli,sizeof(cli));ser.sin_family = AF_INET;// 大小端转化 host to net short ser.sin_port = htons(50000);//小端转大端,50000是端口号ser.sin_addr.s_addr = inet_addr("192.168.203.128");//写自己ip,大端转小端,数字转字符串int ret = bind(sockfd,(SA)&ser,sizeof(ser));//第二步,绑定if(-1 == ret){perror("bind");exit(1);}socklen_t len = sizeof(cli);while(1){char buf[512]={0};recvfrom(sockfd,buf,sizeof(buf),0,(SA)&cli,&len);//第三步,收,0代表工作方式,有人发就接受,没人就等着time_t tm;time(&tm);//拿到时间sprintf(buf,"%s %s",buf,ctime(&tm));sendto(sockfd,buf,strlen(buf),0,(SA)&cli,len);//第四步,发出去,0是默认方式}close(sockfd);return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);//第一步if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser;bzero(&ser,sizeof(ser));ser.sin_family = AF_INET;// 大小端转化 host to net short ser.sin_port = htons(50000);ser.sin_addr.s_addr = inet_addr("192.168.203.128");while(1){char buf[512]="hello,this is udp test";sendto(sockfd,buf,strlen(buf),0,(SA)&ser,sizeof(ser));//第二步bzero(buf,sizeof(buf));recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);//第三步printf("buf is %s\n",buf);sleep(1);}close(sockfd);return 0;
}

 结果:

UDP(用户数据报)(半双工,要么收要么发)

 发完链路就自动释放了,比较节省空间,网络开销比较小,丢包就是因为没有维护链路的状态

数据报:数据和数据间是有间隔的,收发次数要对应,不然就丢了,并且在收的大小建议大于等于包的大小,即使小了,剩下的也不会再收到了

UDP特征

  • 数据有边界
  • 收发次数要对应
  • recvfrom如果没有发送,就会阻塞
  • sendto不会阻塞,他只管发,收不收都可以

UDP传文件的代码

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
#include <fcntl.h>
typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}// man 7 ip struct sockaddr_in ser,cli;bzero(&ser,sizeof(ser));bzero(&cli,sizeof(cli));ser.sin_family = AF_INET;// 大小端转化 host to net short ser.sin_port = htons(50000);//ser.sin_addr.s_addr = inet_addr("127.0.0.1");//活的地址,也代表自己的地址,本地回环,自己跟自己测,这个数据不会发出去ser.sin_addr.s_addr = INADDR_ANY;//代表本机任何一个可用的IP地址,自己跟自己也可以,跟外面也可以,不用大小端转换int ret = bind(sockfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("bind");exit(1);}socklen_t len = sizeof(cli);int fd = open("2.png",O_WRONLY|O_CREAT|O_TRUNC,0666);//trunc是清空,只要有创建后面就给666if(-1 == fd){perror("open");exit(1);}while(1){char buf[512]={0};int rd_ret = recvfrom(sockfd,buf,sizeof(buf),0,(SA)&cli,&len);if(0 == strcmp(buf,"^_^")){break;}write(fd,buf,rd_ret);//收多少写多少bzero(buf,sizeof(buf));strcpy(buf,"go on");//防止发的太快来不及写(收),所以控制他发的速度sendto(sockfd,buf,strlen(buf),0,(SA)&cli,len);}close(sockfd);close(fd);return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
#include <fcntl.h>
typedef struct sockaddr * (SA);int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser;bzero(&ser,sizeof(ser));ser.sin_family = AF_INET;// 大小端转化 host to net short ser.sin_port = htons(50000);ser.sin_addr.s_addr = inet_addr("192.168.203.128");//自己跟自己可以写any,跟别的必须写客户端IP地址int fd = open("/home/linux/1.png",O_RDONLY);if(-1 == fd){perror("open");exit(1);}char buf[512]={0};while(1){bzero(buf,sizeof(buf));int rd_ret = read(fd,buf,sizeof(buf));if(0==rd_ret){break;}sendto(sockfd,buf,rd_ret,0,(SA)&ser,sizeof(ser));bzero(buf,sizeof(buf));recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);}bzero(buf,sizeof(buf));strcpy(buf,"^_^");sendto(sockfd,buf,3,0,(SA)&ser,sizeof(ser));//走到这里证明发送结束了,告诉客户端发送结束了,因为无连接close(sockfd);close(fd);return 0;
}

结果:

练习:UDP的聊天室(一个人发,全都能收到)

服务端是负责转发的,除了不给发消息的人转发,其他人都转

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);
typedef enum {CMD_LOGIN,CMD_CHAT,CMD_LOGOUT}TYPE;
typedef struct 
{TYPE type;char name[50];char context[128];}MSG;
typedef struct 
{struct sockaddr_in cli;int flag; // 0  free 1 occu
}LIST;
#define MAX 10
LIST list[MAX]={0};//最多多少人
int do_login(int sockfd,MSG* msg,struct sockaddr_in* cli)
{int i = 0 ;for(i=0;i<MAX;i++){if(1 == list[i].flag )//等于一证明人在,没退出{sendto(sockfd,msg,sizeof(MSG),0,(SA)&list[i].cli,sizeof(list[i].cli));}}for(i=0;i<MAX;i++){if(0 == list[i].flag ){list[i].flag =1;//list[i].cli = *cli;memcpy(&list[i].cli,cli,sizeof(*cli));break;}}return 0;
}int do_chat(int sockfd, MSG* msg,struct sockaddr_in*cli)//转发
{int i = 0 ;for(i=0;i<MAX;i++){if(1 == list[i].flag && 0!=memcmp(&list[i].cli,cli,sizeof(*cli)) )//确保有人,并且发送方和接收方的ip地址不一样{sendto(sockfd,msg,sizeof(MSG),0,(SA)&list[i].cli,sizeof(list[i].cli));}}
}
int do_logout(int sockfd, MSG* msg,struct sockaddr_in*cli)
{return 0;
}
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}// man 7 ip struct sockaddr_in ser,cli;bzero(&ser,sizeof(ser));bzero(&cli,sizeof(cli));ser.sin_family = AF_INET;// 大小端转化 host to net short ser.sin_port = htons(50000);ser.sin_addr.s_addr = inet_addr("127.0.0.1");int ret = bind(sockfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("bind");exit(1);}socklen_t len = sizeof(cli);MSG msg;while(1){bzero(&msg,sizeof(msg));recvfrom(sockfd,&msg,sizeof(msg),0,(SA)&cli,&len);switch(msg.type){case CMD_LOGIN:do_login(sockfd,&msg,&cli);break;case CMD_LOGOUT:do_logout(sockfd,&msg,&cli);break;case CMD_CHAT:do_chat(sockfd,&msg,&cli);break;}}close(sockfd);return 0;
}

客户端:(并行)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct 

http://www.ppmy.cn/news/1522115.html

相关文章

golang闭包中变量获取

闭包的本质是一个语法糖&#xff0c;其本质是获取外部变量在其内部使用。文中case2和case3并未涉及闭包&#xff0c;只是作为对比案例。case4这个案例有点不能理解&#xff0c;汇编看着太吃力了。case4和case5留待后续再研究。 案例1&#xff1a; package main// 探究go语言中…

ARM SIMD instruction -- fcmpe

FCMPE Floating-point signaling Compare (scalar). This instruction compares the two SIMD&FP source register values, or the first SIMD&FP source register value and zero. It writes the result to the PSTATE.{N, Z, C, V} flags. 浮点数比较&#xff08;标量…

【重学 MySQL】五、MySQL 的卸载

【重学 MySQL】五、MySQL 的卸载 停止MySQL服务卸载MySQL程序删除残余文件清理注册表删除环境变量配置重启电脑 MySQL的卸载过程需要仔细操作&#xff0c;以确保彻底卸载并清理所有相关文件和配置。 停止MySQL服务 打开任务管理器&#xff1a;右键点击任务栏空白处&#xff0…

挂轨巡检机器人在发电厂与煤矿皮带机场景的应用

一、引言 在发电厂和煤矿等重工业领域&#xff0c;皮带机作为关键设备&#xff0c;其运行状态直接关系到生产效率和安全。然而&#xff0c;传统的人工巡检方式不仅效率低下&#xff0c;还存在安全隐患。随着智能巡检技术的不断发展&#xff0c;杭州旗晟智能科技有限公司推出的…

汽车智能驾驶算法汇总

汽车智能驾驶算法是自动驾驶技术的核心&#xff0c;它们集成了多个学科的知识&#xff0c;包括计算机视觉、机器学习、控制理论、路径规划等。以下是对汽车智能驾驶算法的一个详细汇总&#xff0c;内容分为几个关键部分进行阐述。 一、计算机视觉算法 计算机视觉是智能驾驶算…

Gemini AI 与 ChatGPT:哪个更适合为我策划婚礼?

我在六月订婚后&#xff0c;一心想着婚礼钟声&#xff0c;但在看到这些婚礼场地报价后&#xff0c;更像是警铃声响起。 “叮咚”已经被重新混音成“哗啦啦”——我需要帮助。 我甚至不知道如何 开始 计划婚礼。第一步是什么&#xff1f;我需要优先考虑什么&#xff1f;哪些任…

坐牢第三十四天(c++)

一.作业 1.栈的手写 #include <iostream> using namespace std; // 封装一个栈 class stcak { private:int *data; //int max_size; // 最大容量int top; // 下标 public:// 无参构造函数stcak();// 有参构造函数stcak(int size);// 拷贝构造函数stcak(const s…

深度学习从入门到精通——感知损失介绍及基本实现

Perceptual Losses 感知损失&#xff08;Perceptual Loss&#xff09;感知损失的定义 图像转换问题&#xff08;Image Transformation Tasks&#xff09;现有方法代码解释感知损失&#xff08;Perceptual Loss&#xff09;1. 感知损失的背景2. 感知损失的定义3. 感知损失的优点…

[数据集][目标检测]抽烟检测数据集VOC+YOLO格式22559张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;22559 标注数量(xml文件个数)&#xff1a;22559 标注数量(txt文件个数)&#xff1a;22559 标…

MATLAB中的线性规划与非线性规划

目录 1. 引言 2. 线性规划&#xff08;LP&#xff09; 2.1 线性规划的基本概念 2.2 MATLAB中的线性规划求解 2.3 线性规划的应用 3. 非线性规划&#xff08;NLP&#xff09; 3.1 非线性规划的基本概念 3.2 MATLAB中的非线性规划求解 3.3 非线性规划的应用 4. 线性规划…

Opencv中的直方图(2)计算图像的直方图函数calcHist()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算一组数组的直方图。 函数 cv::calcHist 计算一个或多个数组的直方图。用于递增直方图bin的元组的元素是从相同位置的相应输入数组中获取的。…

【kubernetes】配置管理中心Configmap运用

一&#xff0c;介绍 Configmap&#xff08;简写 cm&#xff09;是k8s中的资源对象&#xff0c;用于保存非机密性的配置的&#xff0c;数据可以用key/value键值对的形式保存&#xff0c;也可通过文件的形式保存。 【局限性】&#xff1a;在ConfigMap不是用来保存大量数据的&am…

什么是银行挤兑

银行挤兑是指大量银行客户因为对银行失去信心&#xff0c;担心银行可能无法满足其提款需求&#xff0c;而纷纷在短时间内集中到银行提取现金或转账的行为。这种情况可能会导致银行现金储备迅速减少&#xff0c;进而影响银行的正常运营和金融市场的稳定。 银行挤兑通常发生在以下…

中秋将至,邮寄中秋礼品怎么才安心?

中秋节&#xff0c;是中华民族的传统佳节&#xff0c;承载着人们对团圆的期盼和对亲人的思念。在这个温馨的节日里&#xff0c;中秋礼品成为了许多人传递情感的方式。 在这个数字化的时代&#xff0c;虽然一通电话、一个视频就能拉近人与人之间的距离&#xff0c;但一份实实在在…

Oracle中关于not in的替代方案

Oracle优化连接查询速度 样例exists模式Left join模式 今天在使用dblink的时候&#xff0c;多表关联时发现条件中使用 not in 作为条件&#xff0c;会极大的影响查询速度&#xff0c;尤其是not in中的表数据量很大时&#xff0c;简直是一种灾难&#xff1b;经过翻阅资料&#…

opencv学习:形态学操作和边缘检测算子

cv2.morphologyEx() 是 OpenCV 库中的一个函数&#xff0c;用于执行更复杂的形态学操作。这个函数可以执行开运算、闭运算、梯度运算、膨胀、腐蚀以及顶帽和黑帽转换等。这些操作通常用于图像预处理&#xff0c;如去除噪声、平滑边界、突出特征等。 dst cv2.morphologyEx(src…

构建现代前端应用的利器:深入解析Webpack与Vite的差异与优势

Webpack与Vite概述 在现代前端开发中&#xff0c;构建工具是不可或缺的&#xff0c;它们帮助我们打包、优化和管理项目中的资源。Webpack和Vite是当前流行的两个构建工具&#xff0c;它们各自有着独特的优势和工作机制。 Webpack详解 1. Webpack是什么&#xff1f; Webpack…

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…

2.2ceph集群部署准备-软件准备上

系统的选择 操作系统的选取&#xff0c;除了要考虑ceph本身的运行&#xff0c;一般情况下还需要考虑的因素有如下几点 系统本身的稳定性 目前稳定可靠的系统主要是基于x86和arm的linux系统&#xff0c;ceph并不能安装到windows上&#xff0c;分支上&#xff0c;debian和redhat…

Java后端分布式系统的服务降级:优雅降级与服务熔断

Java后端分布式系统的服务降级&#xff1a;优雅降级与服务熔断 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在分布式系统中&#xff0c;服务降级是一种应对高负载或服务不稳定情况的策略&am…