uc_16_UDP协议_HTTP协议

1  UDP协议

        适合游戏、视频等情景,安全性要求不高,效率要求高。

1)UDP不提供客户机与服务器的链接:

        UDP的客户机与服务器不必存在长期关系。一个UDP的客户机在通过一个套接字向一个UDP服务器发送了一个数据报之后,马上可以通过同一个套接字向另一个UDP服务器发送另一个数据报。同样,一个UDP服务器也可以通过同一个套接字接收来自不同客户机的数据报。

2)UDP不保证数据传输的可靠性和有序性:

        UDP的协议栈底层不提供诸如确认、超时重传、RTT估算以及序列号等机制。因此UDP数据报在网络传输的过程中,可能丢失,也可能重复,甚至重新排序。应用程序必须自己处理这些情况。

3)UDP不提供流量控制:

        UDP的协议栈底层只是一味地按照发送方的速率发送数据,全然不顾接收方的缓冲区是否装得下。

4)UDP是全双工的:

        在一个UDP套接字上,应用程序在任何时候都既可以发送数据也可以接收数据。

UDP编程模型:

        

2  UDP函数

2.1  recvfrom()

        #include <sys/socket.h>

        ssize_t recvfrom( int sockfd,   void* buf,   size_t count,   int flags,   

                                    struct sockaddr* src_addr,   socklen_t* addrlen );

                功能:从哪里接收数据

                前四个参数同recv()

                src_addr:输出源主机的地址信息

                addrlen:输出源主机的地址信息的字节数

                返回值:成功返回实际接收的字节数,失败返回-1 

2.2  sendto()

        #include <sys/socket.h>

        ssize_t sendto( int sockfd,   void const* buf,   size_t count,   int flags,

                                 struct sockaddr const* dest_addr,   socklen_t addrlen );

                功能:发送数据到哪里

                前四个参数同send()

                dest_addr:目的主机的地址信息

                addrlen:目的主机的地址信息的字节数

                返回值:成功返回实际发送的字节数,失败返回-1  

//udpser.c  基于UDP的服务器
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>int main(void){//创建套接字printf("服务器:创建套接字\n");int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd == -1){perror("socket");return -1;}//组织地址结构printf("服务器:组织地址结构\n");struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(8888);ser.sin_addr.s_addr = INADDR_ANY;//绑定套接字和地址结构printf("服务器:绑定套接字和地址结构\n");if(bind(sockfd,(struct sockaddr*)&ser,sizeof(ser)) == -1){perror("bind");return -1;}//业务处理printf("服务器:业务处理\n");for(;;){//接受客户端发来的小写的串char buf[64] = {};struct sockaddr_in cli;//用来输出客户端的地址结构socklen_t len = sizeof(cli);//用来输出地址结构大小if(recvfrom(sockfd,buf,sizeof(buf)-1,0,(struct sockaddr*)&cli,&len) ==-1){perror("recvfrom");return -1;}//转成大写for(int i = 0;i < strlen(buf);i++){buf[i] = toupper(buf[i]);}//将大写的串回传给客户端   if(sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&cli,len) == -1){perror("sendto");return -1;}}//关闭套接字printf("服务器:关闭套接字\n");close(sockfd);return 0;
}

 

//udpcli.c  基于UDP的客户端
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>int main(void){//创建套接字printf("客户端:创建套接字\n");int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd == -1){perror("socket");return -1;}//组织服务器地址结结构printf("客户端:组织服务器地址结结构\n");struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(8888);ser.sin_addr.s_addr = inet_addr("192.168.222.136");//业务处理printf("客户端:业务处理\n");for(;;){//通过键盘获取小写的串char buf[64] = {};fgets(buf,sizeof(buf),stdin);// ! 退出if(strcmp(buf,"!\n") == 0){break;}//发送给服务器if(sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&ser,sizeof(ser)) == -1){perror("sendto");return -1;}//接受回传的大写的串if(recv(sockfd,buf,sizeof(buf)-1,0) == -1){perror("recv");return -1;}//显示printf("%s",buf);}//关闭套接字printf("客户端:关闭套接字\n");close(sockfd);return 0;
}

3  HTTP协议

        浏览器地址栏中输入URL,按下回车后经历的流程:

        1)浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址

        2)根据解析后的IP地址和默认端口80和服务器建立TCP连接

        3)浏览器发出HTTP请求

        4)服务器对浏览器的请求作出响应

3.1  HTTP的请求和响应

        

         请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔,例如GET    /index.html    HTTP/1.1。

        HTTP1.0定义了三种请求方法:GET、POST、HEAD方法。

        HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE、CONNECT方法。

        其中GET是最常用的请求方法,用来获取服务器的数据。

        请求头部由   关键字:值   对组成,每行一对。请求头部会通知服务器有关客户端请求的信息,典型的请求头有:

        -Accept:告诉服务器自己接受什么类型的介质,*/*表示任何类型,type/*表示该类型下的所有子类型;

        -Host:客户端指定自己想访问的web服务器的域名

        -User_Agent:浏览器表名自己的身份,是哪种浏览器。

        -Referer:浏览器web服务器表名自己是从哪个网页URL获得点击当前请求中的地址

        -Connection:表示是否需要持久连接

        

        HTTP响应也是由三个部分组成,分别是:状态行响应头、空行、响应正文

        当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求,常见状态码有:

        200  OK:客户端请求成功

        400  Bad Request:客户端请求有语法错误,不能被服务器所理解。

        403  Forbidden:服务器收到请求,但是拒绝提供服务。

        404  Not Found:请求资源不存在,例如输入了错误的URL。

        503  Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

        

        响应头一般包括以下内容:

        Date:响应时间

        Content-Type:响应类型

        Content-Length:响应数据大小

        Connection:连接状态

//http.c  http协议
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>int main(void){//创建套接字int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("socket");return -1;}//组织百度服务器的地址结构struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(80);ser.sin_addr.s_addr = inet_addr("220.181.38.150");//发起连接请求if(connect(sockfd,(struct sockaddr*)&ser,sizeof(ser)) == -1){perror("connect");return -1;}//组织请求 char request[1024]; "GET / HTTP/1.1\r\nHost: www.baidu.com\r\nAccetp: */*\r\n....."char request[1024] = {};sprintf(request,"GET / HTTP/1.1\r\n""Host: www.baidu.com\r\n""Accept: */*\r\n""Connection: Close\r\n\r\n");    //发送给百度服务器 sendif(send(sockfd,request,strlen(request),0) == -1){perror("send");return -1;}//接收响应 recvfor(;;){char respond[1024] = {};ssize_t size = recv(sockfd,respond,sizeof(respond)-1,0);if(size == -1){perror("recv");return -1;}if(size == 0){break;}printf("%s",respond);}printf("\n");//关闭套接字 close()close(sockfd);return 0;
}

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

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

相关文章

VOL-vue 框架 文件上传控件关于大文件上传等待的修改

我的项目在测试voltable列表组件中对阿里云OSS做附件上传时&#xff0c;几十M的文件可能就会需要一段时间来上传&#xff0c;才能有OSS的状态和链接返回。 但是控件VolUpload.vue并没有去在这方面做任何交互体验上的控制&#xff0c;而且VolUpload.vue本身写的几个上传函数都是…

MyBatis 四大核心组件之 Executor 源码解析

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

【计算机网络】滑动窗口 流量控制 拥塞控制 概念概述

参考资料&#xff1a;计算机网络第八版-视频课程

【大数据】Hudi 核心知识点详解(二)

&#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; 吧 &#xff08;点赞 &#x1f9e1;、关注 &#x1f49b;、收藏 &#x1f49a;&#xff09;&#xff01;&#xff01;&#xff01;您的支持 &#x…

docker-centos中基于keepalived+niginx模拟主从热备完整过程

文章目录 一、环境准备二、主机1、环境搭建1.1 镜像拉取1.2 创建网桥1.3 启动容器1.4 配置镜像源1.5 下载工具包1.6 下载keepalived1.7 下载nginx 2、配置2.1 配置keepalived2.2 配置nginx2.2.1 查看nginx.conf2.2.2 修改index.html 3、启动3.1 启动nginx3.2 启动keepalived 4、…

【小白专用】php执行sql脚本 更新23.12.10

可以使用 PHP 的 mysqli 扩展来执行 SQL 脚本。具体步骤如下&#xff1a; 连接到数据库&#xff1b;打开 SQL 脚本文件并读取其中的 SQL 语句&#xff1b;逐条执行 SQL 语句&#xff1b;关闭 SQL 脚本文件&#xff1b;关闭数据库连接。 以下是通过 mysqli 执行 SQL 脚本的示例…

使用eXtplorer本地搭建文件管理器并内网穿透远程访问本地数据

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是…

SpringSecurity(四)

SpringSecurity初始化的本质 一、对SpringSecurity初始化的几个疑问 通过前面第一次请求访问的分析我们明白了一个请求就来后的具体处理流程 对于一个请求到来后会通过FilterChainProxy来匹配一个对应的过滤器链来处理该请求。那么这里我们就有几个疑惑。 FilterChainProxy什…

【STM32】ADC模数转换器

1 ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 STM32是数字电路&#xff0c;只有高低电平&#xff0c;没有几V电压的概念&#xff…

pytorch一致数据增强

分割任务对 image 做&#xff08;某些&#xff09;transform 时&#xff0c;要对 label&#xff08;segmentation mask&#xff09;也做对应的 transform&#xff0c;如 Resize、RandomRotation 等。如果对 image、label 分别用 transform 处理一遍&#xff0c;则涉及随机操作的…

基于深度学习的超分辨率图像技术一览

超分辨率(Super-Resolution)即通过硬件或软件的方法提高原有图像的分辨率&#xff0c;图像超分辨率是计算机视觉和图像处理领域一个非常重要的研究问题&#xff0c;在医疗图像分析、生物特征识别、视频监控与安全等实际场景中有着广泛的应用。 SR取得了显著进步。一般可以将现有…

Stable diffusion 简介

Stable diffusion 是 CompVis、Stability AI、LAION、Runway 等公司研发的一个文生图模型&#xff0c;将 AI 图像生成提高到了全新高度&#xff0c;其效果和影响不亚于 Open AI 发布 ChatGPT。Stable diffusion 没有单独发布论文&#xff0c;而是基于 CVPR 2022 Oral —— 潜扩…