0723,UDP通信(聪明小辉聪明小辉),HTTP协议

news2024/9/24 7:21:18

我就是一个爱屋及乌的人!!!! #include "network_disk_kai.h"

昨天的epoll:    可恶抄错代码了

epoll_s.c

sockect         return listenfd
  setsockopt
  sockaddr_in
bind           listenfd & serveraddr
listen

epoll_create1  return epfd   //创建epoll实例
  epoll_event
epoll_ctl      (epfd,opt,fd-key,event-value)  //注册
  struct epoll_event[]       //用户态用户来存储就绪的文件描述符?结构体数组
  nready



while(1){
epoll_wait    return nready //大于0--就绪的文件描述符的数量

for(int i=0;i<nready;i++){   //循环处理每一个就绪的事件
   fd=events_arr[i].data.fd;

if(fd==listenfd)    //如果当前事件是监听套接字 listenfd,表示有新的连接请求
{----process_001;}
else{
if(events_arr[i].events & EPOLLIN)  //==  (events_arr[i]events==EPOLLIN)可读事件
{----process_002;}
if(events_arr[i].events & EPOLLOUT)   //可写事件
{----process_003;}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
}
//心情不好,剩下的算了
}
}

要监听的文件描述符都挂红黑树上??怎么过一会看不懂了

 epoll_ctl 函数是 Linux 下用于控制 epoll 实例(epoll descriptor)的函数,主要用于向 epoll 实例中添加、修改或删除需要监视的文件描述符和事件的操作。

一旦文件描述符被注册到 epoll 中,程序就可以使用 epoll_wait 函数进行事件轮询。epoll_wait 会阻塞程序,直到注册的文件描述符中有事件发生或者超时。

轮询的基本工作原理是程序反复地检查某个状态或条件是否满足,直到满足为止。这通常通过一个循环来实现,不断地查询状态并处理相应的事件或数据。

UDP通信:

一对一(抄代码):

//client.c
#include <func.h>

int main()
{
    int clientfd=socket(AF_INET,SOCK_DGRAM,0);
    if(clientfd==-1){error(1,errno,"socket");}

    struct sockaddr_in serveraddr;
    memset(&serveraddr,0,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(8080);
    serveraddr.sin_addr.s_addr=inet_addr("192.168.235.128");
    socklen_t len=sizeof(serveraddr);

    //first 
    const char* msg="hello server  快说:聪明小辉小辉聪明";
    int ret=sendto (clientfd,msg,strlen(msg),0,
                    (const struct sockaddr*)&serveraddr,sizeof(serveraddr));
    printf("lst sento %d bytes\n",ret);

    //sencond send
    ret=sendto(clientfd,msg,strlen(msg),0,
               (const struct sockaddr*)&serveraddr,sizeof(serveraddr));
    printf("2nd sendto %d bytes\n",ret);

    //recvfrom
    char buff[100]={0};
    recvfrom(clientfd,buff,sizeof(buff),0,
             (struct sockaddr*)&serveraddr,&len);
    printf("recvform from sever :%s  \n",buff);
    recvfrom(clientfd,buff,sizeof(buff),0,
             (struct sockaddr*)&serveraddr,&len);
    printf("recvform from sever :%s  \n",buff);

    close(clientfd);
    return 0;
}
//server.c
#include <func.h>

int main()
{
    int serverfd=socket(AF_INET,SOCK_DGRAM,0);
    if(serverfd==-1){error(1,errno,"socket");}

    struct sockaddr_in serveraddr;
    memset(&serveraddr,0,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(8080);
    serveraddr.sin_addr.s_addr=inet_addr("192.168.235.128");

    int ret=bind(serverfd,
                 (const struct sockaddr*)&serveraddr,
                 sizeof(serveraddr));
    if(ret==-1){error(1,errno,"bind");}

    char buff[100]={0};
    struct sockaddr_in clientaddr;
    memset(&clientaddr,0,sizeof(clientaddr));
    socklen_t len=sizeof(clientaddr);

    //接受两次消息
    int cnt=0;
    while(cnt<2){
        printf("before recvfrom\n");
        recvfrom(serverfd,buff,sizeof(buff),0,
                 (struct sockaddr*)&clientaddr,&len);
        printf("recv from client %s  :%d types\n",
               inet_ntoa(clientaddr.sin_addr),
               ntohs(clientaddr.sin_port));
        printf("message is :%s \n\n",buff);
        ++cnt;
    }

    const char* msg="hello client  聪明小辉聪明小辉";
    sendto (serverfd,msg,strlen(msg),0,
            (const struct sockaddr*)&clientaddr,len);
    sendto (serverfd,msg,strlen(msg),0,
            (const struct sockaddr*)&clientaddr,len);
    
    close(serverfd);
    return 0;
}

一对多(抄代码):

//client.c
#include <func.h>

int main()
{
    int clientfd=socket(AF_INET,SOCK_DGRAM,0);
    if(clientfd==-1){error(1,errno,"socket");}

    struct sockaddr_in serveraddr;
    memset(&serveraddr,0,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(8081);
    serveraddr.sin_addr.s_addr=inet_addr("192.168.235.128");
    socklen_t len=sizeof(serveraddr);

    //first 
    const char* msg="hello server  说:姐,你在干嘛";
    int ret=sendto (clientfd,msg,strlen(msg),0,
                    (const struct sockaddr*)&serveraddr,sizeof(serveraddr));
    printf("lst sento %d bytes\n",ret);

    //sencond send
    ret=sendto(clientfd,msg,strlen(msg),0,
               (const struct sockaddr*)&serveraddr,sizeof(serveraddr));
    printf("2nd sendto %d bytes\n",ret);

    //recvfrom
    char buff[100]={0};
    recvfrom(clientfd,buff,sizeof(buff),0,
             (struct sockaddr*)&serveraddr,&len);
    printf("recvform from sever :%s  \n",buff);

    while(1);

    close(clientfd);
    return 0;
}
//server.c
#include <func.h>

int main()
{
    int serverfd=socket(AF_INET,SOCK_DGRAM,0);
    if(serverfd==-1){error(1,errno,"socket");}

    struct sockaddr_in serveraddr;
    memset(&serveraddr,0,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(8081);
    serveraddr.sin_addr.s_addr=inet_addr("192.168.235.128");

    int ret=bind(serverfd,
                 (const struct sockaddr*)&serveraddr,
                 sizeof(serveraddr));
    if(ret==-1){error(1,errno,"bind");}

    char buff[100]={0};
    struct sockaddr_in clientaddr;
    memset(&clientaddr,0,sizeof(clientaddr));
    socklen_t len=sizeof(clientaddr);

    //UDP协议是基于数据包的协议,一次sendto可以用
    //一次recvfrom接受
    //第五个参数clientfd可能是不同的客户端传递过来的
    //不一定是同一个客户端喵,每调用一次都会被修改
    while(1){
        printf("before recvfrom\n");
        recvfrom(serverfd,buff,sizeof(buff),0,
                 (struct sockaddr*)&clientaddr,&len);
        printf("recv from client %s  :%d types\n",
               inet_ntoa(clientaddr.sin_addr),
               ntohs(clientaddr.sin_port));
        printf("message is :%s \n\n",buff);

        const char* msg="hello client  聪明小辉聪明小辉";
        sendto (serverfd,msg,strlen(msg),0,
            (const struct sockaddr*)&clientaddr,len);
    }

    
    close(serverfd);
    return 0;
}

失败了喵!!!!我知道了!!!!客户端的是随机分配的我只要断开再连一次就好了!!!聪明小辉!!!!
聪明小辉!!!!
聪明小辉!!!!
聪明小辉!!!!
聪明小辉!!!!

HTTP协议:

作业:

01:使用select实现一个基于UDP的一对一即时聊天程序。
 

02:什么是HTML、CSS和Javascript?

HTML        超文本标记语言,对文档进行展示
URI/URL   对文档进行定位
HTTP        对文档进行传输

03: URI由哪些部分组成?

scheme  协议名,方案名
user information   
post        主机信息
port         
path        路径(虚拟路径,分为静态路径,动态路径
query      查询词(多个查询词之间用&连接
fragment  网页中其中一个章节,片段

04:HTTP的中文全称是什么?从全称的每个字段来说明HTTP的特点。

超文本传输协议(hyper text transfer protocol)
hyper text 超文本,不止包含文本,还包括JPG,GIF等二进制文件
transfer 传输,一个request必须对应一个response
protocol 协议,基于TCP协议
特点:CS模型,可靠,无状态(每一个HTTP请求都是独立的,不依赖于上下文),文明协议(报文头是字符串的)

05:为什么需要将HTTP协议设计成无状态的呢?

  • 简化实现和提高可靠性
  • 提高性能
  • 可扩展性好,更容易进行水平扩展
  • 适应分布式计算环境

06:HTTP协议与TCP协议的区别有哪些呢?--AI

  1. HTTP协议

    • 功能:HTTP协议是应用层协议,用于在客户端和服务器之间传输超文本文档(如HTML页面)、图像、视频、音频等数据。
    • 特点:HTTP协议是无状态的,每个请求和响应之间是独立的,服务器不会保存客户端的状态信息。
    • 传输方式:HTTP协议依赖于下层的传输协议,通常是TCP协议,也可以使用TLS/SSL进行加密(HTTPS)。
  2. TCP协议

    • 功能:TCP协议位于传输层,负责在通信的两个应用程序之间提供可靠的、面向连接的数据传输服务。
    • 特点:TCP协议提供数据传输的可靠性,通过数据确认、重传机制和流量控制来保证数据的完整性和有序性。
    • 传输方式:TCP协议提供全双工的数据传输,客户端和服务器之间可以同时发送和接收数据。

主要区别和联系:

  • 层级不同:HTTP协议位于应用层,而TCP协议位于传输层。
  • 功能不同:HTTP协议负责定义数据传输的格式和规范,而TCP协议负责确保数据传输的可靠性和顺序性。
  • 依赖关系:HTTP协议依赖于TCP协议来传输数据,因此在网络通信中,HTTP协议使用TCP作为其传输层协议之一。
  • 组合使用:HTTP协议可以通过加密层(如TLS/SSL)在TCP之上实现安全传输(HTTPS),提供加密和身份验证功能。

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

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

相关文章

Zilliz 推出 Spark Connector:简化非结构化数据处理流程

随着人工智能&#xff08;AI&#xff09;和深度学习&#xff08;Deep Learning&#xff09;技术的高速发展&#xff0c;使用神经网络模型将数据转化为 Embedding 向量 已成为处理非结构化数据并实现语义检索的首选方法&#xff0c;广泛应用于搜索、推荐系统等 AI 业务中。 以生…

Windows 11+Visual Studio 2022 环境OpenCV+CUDA 12.5安装及踩坑笔记

周六日在家捣腾了一下&#xff0c;把过程记录下来。 前置条件 Visual Studio C 生成工具和本机显卡适配的CUDA与CUDA匹配的cuDNNPython 3NumPyOpenCV源代码以及对应版本的OpenCV-contrib模块源码CMake Visual Studio 下载Visual Studio&#xff08;我本机的是VS2022&#xf…

虚拟局域网配置与分析-VLAN

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 虚拟局域网&#xff08;Virtual Local Area Network&#xff0c;VLAN&#xff09;是一组逻辑上的设备和用户&#xff1b;不受物理位置的…

二、【Python】入门 - 【PyCharm】安装教程

往期博主文章分享文章&#xff1a; 【机器学习】专栏http://t.csdnimg.cn/sQBvw 目录 第一步&#xff1a;PyCharm下载 第二步&#xff1a;安装&#xff08;点击安装包打开下图页面&#xff09; 第三步&#xff1a;科学使用&#xff0c;请前往下载最新工具及教程&#xff1a…

前端:Vue学习-3

前端&#xff1a;Vue学习-3 1. 自定义指令2. 插槽2.1 插槽 - 后备内容&#xff08;默认值&#xff09;2.2 插槽 - 具名插槽2.3 插槽 - 作用域插槽 3. Vue - 路由3.1 路由模块封装3.2 声明式导航 router-link 高亮3.3 自定义匹配的类名3.4 声明式导肮 - 跳转传参3.5 Vue路由 - 重…

C#初级——条件判断语句和循环语句

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

Python面试宝典第18题:单词搜索

题目 给定一个m x n的二维字符网格board和一个字符串单词word。如果word存在于网格中&#xff0c;返回true。否则&#xff0c;返回false。单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成。所谓相邻单元格&#xff0c;是那些水平相邻或垂直相邻的单元格。 备注&…

Blender材质-PBR与纹理材质

1.PBR PBR:Physically Based Rendering 基于物理的渲染 BRDF:Bidirection Reflectance Distribution Function 双向散射分散函数 材质着色操作如下图&#xff1a; 2.纹理材质 左上角&#xff1a;编辑器类型中选择&#xff0c;着色器编辑器 新建着色器 -> 新建纹理 -> 新…

爬虫学习3:爬虫的深度爬取

爬虫的深度爬取和爬取视频的方式 深度爬取豆瓣读书 import time import fake_useragent import requests from lxml import etree head {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 …

[AWS]MSK调用,报错Access denied

背景&#xff1a;首先MSK就是配置一个AWS的托管 kafka&#xff0c;创建完成之后就交给开发进行使用&#xff0c;开发通常是从代码中&#xff0c;编写AWS的access_key 和secret_key进行调用。 但是开发在进行调用的时候&#xff0c;一直报错连接失败&#xff0c;其实问题很简单&…

AI学习记录 - 本地知识库实现的相关知识

在公司内部实现了个知识库&#xff0c;由于保密吗&#xff0c;只介绍在实现知识库的过程中用到的知识&#xff08;虽然知识库也是个烂大街的东西了hehehehe&#xff09; 1、分词器 先分词&#xff0c;中文可以使用jieba分词 2、构造数据集 将词汇向量化是自然语言处理中的…

OpenHarmony 开发

本心、输入输出、结果 文章目录 OpenHarmony 开发前言JonathanOpenHarmony 并不是 AndroidOpenHarmony 应用迁移OpenHarmony 的开发流程OpenHarmony 开发 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你有帮助,欢迎点赞、收藏、评…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

vim gcc

vim 使用 vs filename 分屏 ctrl ww 切窗口 shift zz 快速提出vim vim配置 vim启动时自动读取当前用户的家目录的.vimrc文件 vim配置只影响本用户 其他用户观看同一文件不受影响 gcc指令 & c文件编译过程 动态库 静态库 & 链接方式 有相应库才能进行…

数据传输安全--IPSEC

目录 IPSEC IPSEC可以提供的安全服务 IPSEC 协议簇 两种工作模式 传输模式 隧道模式 两个通信保护协议&#xff08;两个安全协议&#xff09; AH&#xff08;鉴别头协议&#xff09; 可以提供的安全服务 报头 安全索引参数SPI 序列号 认证数据 AH保护范围 传输模…

深入浅出WebRTC—LossBasedBweV2

WebRTC 同时使用基于丢包的带宽估计算法和基于延迟的带宽估计算法那&#xff0c;能够实现更加全面和准确的带宽评估和控制。基于丢包的带宽估计算法主要依据网络中的丢包情况来动态调整带宽估计&#xff0c;以适应网络状况的变化。本文主要讲解最新 LossBasedBweV2 的实现。 1…

SSIS_SQLITE

1.安装 SQLite ODBC 驱动程序 2.添加SQLite数据源 在“用户DSN”或“系统DSN”选项卡中&#xff0c;点击“添加”。选择“SQLite3 ODBC Driver”&#xff0c;然后点击“完成”。在弹出的配置窗口中&#xff0c;设置数据源名称&#xff08;DSN&#xff09;&#xff0c;并指定S…

python实现特征检测算法4

python实现Richardson-Lucy 反卷积算法 Richardson-Lucy 反卷积算法算法原理Python实现详细解释Richardson-Lucy算法的优缺点应用领域Richardson-Lucy 反卷积算法 Richardson-Lucy反卷积算法是一种迭代算法,用于恢复因成像系统中的点扩散函数(PSF)导致的模糊图像。该算法最…

Spring MVC 应用分层

1. 类名使⽤⼤驼峰⻛格&#xff0c;但以下情形例外&#xff1a;DO/BO/DTO/VO/AO 2. ⽅法名、参数名、成员变量、局部变量统⼀使⽤⼩驼峰⻛格 3. 包名统⼀使⽤⼩写&#xff0c;点分隔符之间有且仅有⼀个⾃然语义的英语单词. 常⻅命名命名⻛格介绍 ⼤驼峰: 所有单词⾸字⺟…

【LLM-推理】Self-Refine:使用feedback迭代修正LLM的Output

来源&#xff1a; https://selfrefine.info/ 1.论文速读(摘要引言) 本文主要提出了Self-Refine策略&#xff0c;旨在通过一个LLM不断refine修正LLM的输出&#xff0c;使其在无需额外训练的情况下&#xff0c;在下游任务产生更好的效果。 该方法的直观Insight&#xff1a;我们…