服务器是基于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);