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");    

    //发送给百度服务器 send
    if(send(sockfd,request,strlen(request),0) == -1){
        perror("send");
        return -1;
    }
    //接收响应 recv
    for(;;){
        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.mfbz.cn/a/234894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言----文件操作(一)

一&#xff1a;C语言中文件的概念 对于文件想必大家都很熟悉&#xff0c;无论在windows上还是Linux中&#xff0c;我们用文件去存储资料&#xff0c;记录笔记&#xff0c;常见的如txt文件&#xff0c;word文档&#xff0c;log文件等。那么&#xff0c;在C语言中文件是什么样的存…

unity 2d 入门 飞翔小鸟 死亡闪烁特效(十三)

一、c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Bling : MonoBehaviour {public Texture img;public float speed;public static bool changeWhite false;private float alpha0f;// Start is called before the fi…

极速学习SSM之SpringMVC笔记

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

kafka中消息key作用与分区规则关系

在 kafka 2.0.0 的 java sdk 中 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.12</artifactId><version>2.0.0</version> </dependency> ProducerRecord 中类注释如下 A key/value pair to be sen…

TypeScript 之 console的使用

语言&#xff1a; TypeScript 在线工具&#xff1a; PlayGround console console 对象是一个非常强大的控制台日志显示工具&#xff0c; 可以帮助我们在浏览器中调试代码。 注&#xff1a; console不属于TypeScript的语法&#xff0c;而是由JavaScript封装的内置对象。 简单的…

[AutoSar]一种ECU间CAN通信的优化方法

目录 关键词平台说明一、背景二、问题现象三、原因四、解决办法五、实现5.1 配置5.2 code 关键词 嵌入式、C语言、autosar 平台说明 项目ValueOSautosar OSautosar厂商EB芯片厂商英飞凌 TC397编程语言C&#xff0c;C编译器TASKING 一、背景 在一个项目中&#xff0c;会从多个…

【Proteus仿真】【51单片机】光照强度检测系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;PCF8591 ADC模块、光敏传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示光传感器采集光照强度值&#xff…

【Python网络爬虫入门教程2】成为“Spider Man”的第二课:观察目标网站、代码编写

Python 网络爬虫入门&#xff1a;Spider man的第二课 写在最前面观察目标网站代码编写 第二课总结 写在最前面 有位粉丝希望学习网络爬虫的实战技巧&#xff0c;想尝试搭建自己的爬虫环境&#xff0c;从网上抓取数据。 前面有写一篇博客分享&#xff0c;但是内容感觉太浅显了…

JavaScript常用技巧专题二

文章目录 一、前言二、生成随机字符串三、转义HTML特殊字符四、单词首字母大写五、将字符串转换为小驼峰六、删除数组中的重复值七、移除数组中的假值八、获取两个数字之间的随机数九、将数字截断到固定的小数点十、日期10.1、计算两个日期之间天数10.2、从日期中获取是一年中的…

alpine linux 之嵌入式搭建

目录 序启动修改源安装 openssh设置开机网络 ip参考 序 最近发现了 alpine linux 这个文件系统&#xff0c;这是一个基于 musl libc 和 busybox 的面向安全的轻量级 Linux 发行版。 下载了他的文件系统&#xff0c;只有 3M 多的压缩包&#xff0c;非常适合嵌入式系统。 地址…

MVC Gantt Wrapper:RadiantQ jQuery

The RadiantQ jQuery Gantt Package includes fully functional native MVC Wrappers that let you declaratively and seamlessly configure the Gantt component within your aspx or cshtm pages just like any other MVC extensions. 如果您还没有准备好转向完全基于客户端…

【动手学深度学习】(十二)现代卷积神经网络

文章目录 一、深度卷积神经网络AlexNet1.理论知识 一、深度卷积神经网络AlexNet 1.理论知识 ImageNet(2010) 图片自然物体的彩色图片手写数字的黑色图片大小468 * 38728*28样本数1.2M60K类数100010 AlexNet AlexNet赢了2012ImageNet竞赛更深更大的LeNet主要改进&#xff…

多维时序 | MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现TSOA-TCN-Multihead-…

lv12 开发板启动过程

1 开发板启动过程 1.1 回顾芯片手册第三章内存映射 对于arm来说&#xff0c;不是给它多大的内存都能读。寻址空间&#xff08;地址空间&#xff09;读写范围是有限的&#xff0c;寻址空间的大小与地址总线宽度有关&#xff0c;如32位&#xff0c;地址空间4G&#xff08;2^32)…

【VRTK】【VR开发】【Unity】13-攀爬

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 VRTK提供两个预制件实现攀爬 Climbing Controller,用于控制Player的物理义体Climbable Interactable,用于设置可攀爬对象【设置Climbing Controller…

ffmpeg编解码——数据包(packet)概念(如何正确处理数据包中的pts与dts关系?)(有疑问)

文章目录 FFmpeg编解码——数据包&#xff08;Packet&#xff09;概念1. 数据包&#xff08;Packet&#xff09;简介2. 数据包&#xff08;Packet&#xff09;在FFmpeg中的应用2.1 从媒体文件读取数据包2.2 向媒体文件写入数据包 3. 数据包&#xff08;Packet&#xff09;相关问…

【JavaSE专栏63】多态:让你的面向对象编程变得更强大

魔法多态&#xff1a;让你的面向对象编程变得更强大 《魔法多态&#xff1a;让你的面向对象编程变得更强大》摘要 &#x1f680;引言 &#x1f310; 一、多态&#xff1a;概念与本质解析 &#x1f4da;多态性的本质多态的实现方式多态性与面向对象编程的关系多态的具体案例与应…

Wireshark添加自定义协议解析

最终效果如下&#xff1a; 参考文档&#xff1a;https://mika-s.github.io/topics/ 此参考文档中7个例子教我们如何编写lua脚本去识别我们自定义的协议 安装Wireshark https://www.wireshark.org/上下载安装包安装即可。我的安装路径是D:\Install\Wireshark&#xff0c;在W…

048:利用vue-video-player播放m3u8

第048个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

C#图像处理OpenCV开发指南(CVStar,09)——边缘识别之Scharr算法的实例代码

1 边缘识别之Scharr算法 算法文章很多&#xff0c;不再论述。 1.1 函数原型 void Cv2.Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType&#xff09; 1.2 参数说明 src 代表原始图像。dst 代表目标图像。ddepth 代表输出图像的深度。CV_16Sdx 代表x方向上的求导阶数…
最新文章