/**

介绍下开发环境

linux 2.6.x内核

redhat 5

gcc 4.4

httpserver.c

**/

/*-----------------------------------------------------------------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <errno.h>
#include "wrap.h"
#include "httpserver.h"

#define MAX_LINE 512
#define DEF_DIR "/home/tyrael"

static struct sockaddr_in host_addr;
static int hostfd;

static char err404[512] = "HTTP/1.1 404 ERROR\r\nConnectlon:close\r\n";
static char context[8192] = {0};

typedef struct request_line {
char request_type[10];
char path[512];
char http_version[10];
} request_line_t;

char* _strstrip(char* str) {
int len = strlen(str);
if (!len)
return str;
char* tmp = str + len -1;
while (isspace(*tmp)) {
*tmp = 0;
tmp--;
}

while (isspace(*str)) {
*str = 0;
str++;
}

return str;
}

void read_requestline(const char* src,struct request_line *req_line) {
char* point = NULL;
char* spc = NULL;
char* start = NULL;
char* end = NULL;
if (src && req_line) {
if ((start = spc = strchr(src,' '))) {
strncpy(req_line->request_type,src,spc - src);
req_line->request_type[spc - src] = 0;
}
if ((end = spc = strrchr(src,' '))) {
strncpy(req_line->http_version,spc + 1,src + strlen(src) - spc);
}
if (start && end) {
strncpy(req_line->path,start + 1,end - start);
req_line->path[end - start] = 0;
}

} else
return ;
}

int start_http(const char* ip, int port) {
int clientfd,clientlen,status;
struct sockaddr_in clientaddr;
char buf[MAX_LINE * 100] = {0};
if (!ip)
err_exit("IP MUST DON'T NULL");
if (port <=0 || port >65535)
err_exit("PORT MUST >0 AND <= 65535");
Set_addr_port(&host_addr,NULL,port);

hostfd = Socket(AF_INET,SOCK_STREAM,0);

int f = 1;
setsockopt(hostfd,SOL_SOCKET,SO_REUSEADDR,&f,sizeof(f));

Bind(hostfd,(struct sockaddr *)&host_addr,sizeof(host_addr));

Listen(hostfd,20);

char* point = NULL;

char* tmp_store = buf;

char request_line[MAX_LINE] = {0};

while (1) {
clientlen = sizeof(clientaddr);
clientfd = Accept(hostfd,(struct sockaddr *)&clientaddr,&clientlen);
printf("%s\n",inet_ntoa(clientaddr.sin_addr));

//status = Readline(clientfd,buf,MAX_LINE);
while (1) {
status = Read(clientfd,tmp_store,512);
if (status == -1)
break;
printf("%s",buf);
if (status < 512)
break;
tmp_store += status;
*tmp_store = 0;
}
if (strlen(buf) > 0) {
point = strstr(buf,"\r\n");
if (point) {
strncpy(request_line,buf,point - buf);
request_line[point-buf] = 0;
struct request_line rl;
memset(&rl,0,sizeof(request_line));
read_requestline(request_line,&rl);
printf("#%s\n",rl.request_type);
if (!strncmp(rl.request_type,"GET",3) ||!strncmp(rl.request_type,"POST",4) || !strncmp(rl.request_type,"HEAD",4)) {
if (strlen(rl.path)) {

char* _c = strrchr(rl.path,'.');
int len = strlen(rl.path);
if (_c) {
if (!strncasecmp(_c + 1,"jpg",3)) {
strcpy(context,"HTTP/1.1 200 OK\r\nContext-Type: image/jpg\r\n\r\n");
printf("#jpg\n");
} else {
strcpy(context,"HTTP/1.1 200 OK\r\nContext-Type: text/html\r\n\r\n");
printf("#html\n");
}
} else {
strcpy(context,"HTTP/1.1 200 OK\r\nContext-Type: text/html\r\n\r\n");
printf("#other\n");
}

int filefd;
char fileaddr[256] = {0};
strcpy(fileaddr,DEF_DIR);
strcat(fileaddr,_strstrip(rl.path));
filefd = open(fileaddr,O_RDONLY);
printf("#%s#\n",fileaddr);
if (filefd == -1) {
perror("err");
printf("#%s\n",fileaddr);
memset(fileaddr,0,strlen(fileaddr));
strcpy(fileaddr,DEF_DIR);
strcat(fileaddr,"/err.html");
filefd = open(fileaddr,O_RDONLY);
memset(context,0,8192);
strcpy(context,"HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n<html><body>request file not found</body></html>");
Write(clientfd,context,strlen(context));
} else {

char test[512] = {0};
int co = 0;
char* cont = context;
int count_img = 0;
while (1) {
co = read(filefd,test,512);
count_img += co;
if (co <=0) {
if (co == -1)
perror("error:");
break;
}
//strcat(context,test);
memcpy(cont,test,512);
cont += 512;
memset(test,0,512);
}
int c = Write(clientfd,context,count_img);
printf("%d\n",c);
}

} else {
int c = Write(clientfd,err404,strlen(err404));
printf("%d\n",c);
}
}
close(clientfd);
printf("#%s$\n",rl.path);
printf("#%s\n",rl.http_version);
}
}

}
}

简易http服务器的实现(实现)httpserver.c相关推荐

  1. python3编写简易统计服务器

    打点这个功能总是美其名曰"帮助提升用户体验",其实说白了就是记录用户做了哪些操作.目前国内很多通用软件都做了相关功能,像360.QQ等这样的以用户体验出众的软件,其打点的面自然也很 ...

  2. RHEL5系统 sendmail+qpopper 架设简易邮件服务器

    转自 "小蜗牛技术之家" 博客  原稿: http://snailwarrior.blog.51cto.com/680306/139098 [小蜗牛奋力之作 ] 目标:在RHEL5 ...

  3. python 简易HTTP服务器搭建

    安装Python简易HTTP服务器 大多数Linux/Unix/mac OS操作系统都已默认安装,直接运行以下命令即可,其中"8008"为指定的端口号:如果没有安装python,可 ...

  4. cefsharp 发送请求服务器_使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求...

    使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求 目录 一.引言 二.项目渊源 三.软件使用及 SIP INVITE 流程 (一) 注册和心跳 (二) 直播 INVITE 四 ...

  5. PHP服务器脚本实例,Shell脚本实现的一个简易Web服务器例子分享_linux shell

    这篇文章主要介绍了Shell脚本实现的一个简易Web服务器例子分享,本文实现的Web服务器非常简单实用,可以在你不想安装nginx.apache等大型WEB服务器时使用,需要的朋友可以参考下 假设你想 ...

  6. python局域网大文件_[源码]Python简易http服务器(内网渗透大文件传输含下载命令)...

    Python简易http服务器源码 import SimpleHTTPServer import SocketServer import sys PORT = 80 if len(sys.argv) ...

  7. Socket 简易静态服务器 WPF MVVM模式(一)

    整体代码下载 主要实现功能: Socket的简单应用 可修改IP和端口 显示来访信息 界面设计: 界面采用MVVM设计,很简陋. 前台的主要目的是 输入IP地址 输入端口 输入文件目录 开启监听和停止 ...

  8. 使用bind构建本地简易dns服务器

    本篇博客主要介绍如何在linux上构建简易dns服务器,内容涵盖本地dns解析,主从dns服务器区域传送.rndc的使用以及如何在主域中添加子域 说明: 本实验操作均在VMware10上实现,需要准备 ...

  9. 本地计算机架设http服务器,Http File Server(简易Http服务器服务端)

    如果您感觉配置IIS和apache等web服务端太麻烦的话,不妨试试Http File Server,Http File Server是一套简易的Http服务器服务端系统,它无需安装,运行后简单配置一 ...

  10. node.js搭建简易Web服务器

    node.js搭建简易Web服务器 node.js简介 Node.js 是一个基于V8引擎的JavaScript 运行环境. V8 是为Google Chrome 提供支持的 JavaScript 引 ...

最新文章

  1. python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参...
  2. [architecture]-ARMV7架构下Linux Kernel的Userspace进程切换时保存和恢复哪些寄存器
  3. 每天学点java_反射作用
  4. 你需要的git命令大全来了
  5. 一张图理清ASP.NET Core启动流程
  6. Differential Geometry之第八章常Gauss曲率曲面
  7. Kaggle泰坦尼克数据科学解决方案
  8. 互联网面试八股文之Java基础
  9. 移动政企Java线上测评_(重要)如何锻炼训练,确保通过企业线上测评 在线测评和职业性格测评...
  10. 两个方法教你彻底解决win10系统更新补丁安装失败的问题
  11. Projector的用法
  12. 影响中国青年的100句人生名言 1
  13. 1.27(Bomb Game)
  14. 方正证券:新一代认证核心系统换代升级,坚持实践金融科技全栈自主可控
  15. DIV布局`电影在线 网站设计——漫威电影(2页) HTML+CSS+JavaScript 学生DW网页设计作业成品
  16. 电脑休眠唤醒后无法显示WIFI列表
  17. YUV RGB 相互转换矩阵
  18. 比ping更强大的fping
  19. 2020大学生安全教育网课课后答案
  20. 昆仑mcp文件是什么版本_高性价比重疾险昆仑健康保,12月31日截止投保,想要要趁早!...

热门文章

  1. 查看计算机真实用户名(username)
  2. Home Assistant 自动化
  3. msg1500说明书_MSG1500刷机笔记
  4. 墨菲定律: If anything can go wrong,it will.
  5. dellR230服务器如何进PE系统,戴尔服务器怎么进入u盘启动模式 选择oneshotbios
  6. 封装win7系统,安装系统时提示:windows无法完成系统配置,若要尝试恢复配置,请重新启动计算机?
  7. Less入门以及一些前端面试题
  8. 【二极管】稳压二极管全面分析
  9. 用计算机三角函数公式,电脑是通过什么公式计算出三角函数的?
  10. Linux学习之安装配置VM虚拟机