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