浏览器请求服务器静态文件的实现

本文探讨了如何使用Epoll ET模式实现服务器,遇到的问题包括处理根目录路径、去除URL前缀、优化大文件发送、正确处理超链接和中文编码转换。作者分享了相应解决方案,如调整工作目录、设置ET模式、延迟发送数据和编码处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器是基于epoll实现 ET模式 非阻塞模式,浏览器用Get请求方式访问服务器本地资源

写这个demo过程中遇到问题:

          1.浏览器 访问的 例如  192.168.1.130:8989/ 这个 '/'这个根文件不是服务器跟目录而是服务器的本地资源相对路径,所有要切换服务器的目录到 浏览器资源访问的目录下 通过chdir设置,浏览器访的 路径  假设一个图片 192.168.1.130:8989/wsy.png; 通过http数据的解析 我们得到的是 

/wsy.png 此时需要去掉 '/' 

          2.epoll ET模型 ,收到新的客户端连接,需要将通信描述符标记 改为非阻塞模式,事件加上ETPOLLET 此时 read 和recv 不阻塞,通过while循环将数据读完, 

          3.服务器给客户端发送比较大的图片时候的由于服务器发送的数据过快,导致浏览器显示数据不全,(由于缓冲机制覆盖问题 丢失数据导师浏览器的数据缺陷注:tcp协议数据是不会跌势,是浏览器的本身刷新的原因),所以需要加发送数据给浏览器的时候 稍微延时处理即可

          4.浏览器访问多个文件夹里面的数据会出现 超链接访问的路径不对,

 if ( S_ISDIR(st.st_mode))  //the file is dir , so add '/'
        {
            sprintf(buf+strlen(buf), "<tr><td><a charset=\"UTF-8\" href=\"%s
/\">%s</a></td><td>%s</td></tr>",name, name, subBuf); 需要判断是不是一个文件 然后在超链接后面加一个'/'
        },这样就可以解决路径访问不对的问题

        5.由于http数据的传输过程中不会有中文的,所以浏览器带有中文的数据  比如:192.168.1.130:8989/风景.png, 此时浏览器会自动将 ‘风景’转化为 Unicode 码形式 %E8%86%84.png,此时浏览器访问服务器本地资源就找不到,我们就要将浏览器中文编码unicode还原为utf-8格式编码,将16进制转化为10进制字符,函数 decodeMsg(),就可以找到服务器本地资源目录的风景.png图片资源

 

 

// server.c
#ifndef _SERVER_H_

#define _SERVER_H_



#include<stdlib.h>

#include<stdio.h>

#include<sys/epoll.h>

#include<arpa/inet.h>

#include<unistd.h>

#include<errno.h>

#include<fcntl.h>

#include<string.h>

#include<sys/stat.h>

#include<strings.h>

#include<dirent.h>

#include<ctype.h>



int initListenFd(unsigned short prot);



int epollRun(int lfd);



int acceptNewConnect(int lfd, int epfd);



int recvHttpRequest(int fd, int epfd);



int parseHttpLine(const char* buf, int fd);



int sendHttpHeadMsg(int fd, int staus, const char* dscr, const char* type, int leght);



//

int  sendFileInfo(int fd, const char* name);



int sendDirInfo(int fd, const char*dirname);



//

const char* getFileTypeByName(const char* name);



void decodeMsg(char* to, char* from);



int hextoDex(char c);









#endif



//server.c
#include "server.h"

int initListenFd(unsigned short prot)
{
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间溜走了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值