我就是一个爱屋及乌的人!!!! #include "network_disk_kai.h"
昨天的epoll: 可恶抄错代码了
epoll_s.csockect return listenfdsetsockoptsockaddr_in
bind listenfd & serveraddr
listenepoll_create1 return epfd //创建epoll实例epoll_event
epoll_ctl (epfd,opt,fd-key,event-value) //注册struct epoll_event[] //用户态用户来存储就绪的文件描述符?结构体数组nreadywhile(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 sendret=sendto(clientfd,msg,strlen(msg),0,(const struct sockaddr*)&serveraddr,sizeof(serveraddr));printf("2nd sendto %d bytes\n",ret);//recvfromchar 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 sendret=sendto(clientfd,msg,strlen(msg),0,(const struct sockaddr*)&serveraddr,sizeof(serveraddr));printf("2nd sendto %d bytes\n",ret);//recvfromchar 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
HTTP协议:
- 功能:HTTP协议是应用层协议,用于在客户端和服务器之间传输超文本文档(如HTML页面)、图像、视频、音频等数据。
- 特点:HTTP协议是无状态的,每个请求和响应之间是独立的,服务器不会保存客户端的状态信息。
- 传输方式:HTTP协议依赖于下层的传输协议,通常是TCP协议,也可以使用TLS/SSL进行加密(HTTPS)。
TCP协议:
- 功能:TCP协议位于传输层,负责在通信的两个应用程序之间提供可靠的、面向连接的数据传输服务。
- 特点:TCP协议提供数据传输的可靠性,通过数据确认、重传机制和流量控制来保证数据的完整性和有序性。
- 传输方式:TCP协议提供全双工的数据传输,客户端和服务器之间可以同时发送和接收数据。
主要区别和联系:
- 层级不同:HTTP协议位于应用层,而TCP协议位于传输层。
- 功能不同:HTTP协议负责定义数据传输的格式和规范,而TCP协议负责确保数据传输的可靠性和顺序性。
- 依赖关系:HTTP协议依赖于TCP协议来传输数据,因此在网络通信中,HTTP协议使用TCP作为其传输层协议之一。
- 组合使用:HTTP协议可以通过加密层(如TLS/SSL)在TCP之上实现安全传输(HTTPS),提供加密和身份验证功能。