自学内容网 自学内容网

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

我就是一个爱屋及乌的人!!!! #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),提供加密和身份验证功能。

原文地址:https://blog.csdn.net/qq_51583806/article/details/140624694

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!