/****************************************************************
filename: http_server.c
author: xxxx
function: Main file of http server
Impliment the response of Get and Post mehtods history:
created by xxxx date: 2014.01.03 *****************************************************************/ #include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h> #include "mime.h"
#include "http_common.h"
#include "http_webapp.h"
// __DEBUG__ is debug tag #define BACK_LOG 50
#define SOCKLEN sizeof(struct sockaddr_in) //
static int open_socket(struct sockaddr_in*);
static int accept_client(int sockfd, struct sockaddr_in* paddr);
static void wait_child(); static void write_response_body(int connfd, char* uri, int filesize);
void process_request(int connfd); int main()
{
// char type[MAX_FILE_TYPE_LEN]="";
// get_mime_type("test.html",type); int sockfd = ;
int connfd = ;
struct sockaddr_in sockaddress;
pid_t chld = ;
//struct sigaction sa; bzero(&sockaddress, sizeof(struct sockaddr_in));
signal(SIGCHLD, wait_child);
//open sock
if((sockfd=open_socket(&sockaddress)) == -)
{
perror("open socket failed");
return -;
} //accept client connection
while()
{
connfd = accept_client(sockfd, &sockaddress); #if __DEBUG__
printf("client accept [%d]\n ", connfd);
#endif if((chld = fork()) > )
{ //root
close(connfd);
continue;
}else if(chld == )
{ //childi
process_request(connfd);
close(sockfd);
exit();
} } return ;
} /*--------------------------------------------------------------- functionname: open_socket
param: NA
return: return sockfd on success, -1 on fail
author: xxxx ----------------------------------------------------------------*/
static int open_socket(struct sockaddr_in* paddr)
{
int sockfd = ;
struct sockaddr_in sockaddress; bzero(&sockaddress, sizeof(sockaddress)); if((sockfd = socket(AF_INET, SOCK_STREAM, )) == -)
return -; sockaddress.sin_family = AF_INET;
sockaddress.sin_port = htons(HTTP_PORT); inet_pton(AF_INET, "10.174.8.163", &(sockaddress.sin_addr)); if(bind(sockfd, (struct sockaddr*)(&sockaddress), sizeof(sockaddress)) == -)
return -; if(listen(sockfd, BACK_LOG) == -)
return -; *paddr = sockaddress;
return sockfd;
} /*--------------------------------------------------------------- functionname: accept_client
param: NA
return: return connfd on success, -1 on fail
author: xxxx ----------------------------------------------------------------*/ static int accept_client(int sockfd, struct sockaddr_in* paddr)
{
socklen_t len = SOCKLEN;
int connfd = ; if(paddr != NULL)
{
connfd = accept(sockfd, (struct sockaddr*)(paddr), &len);
}else
{
connfd = -;
}
return connfd;
} /*---------------------------------------------------------------- functionname: wait_child_exit
param: NA
return: NA
author: xxxx TO KILL CHILD PROCESS, avoid ZOOBIE -----------------------------------------------------------------*/ static void wait_child()
{
int status = ;
while(waitpid(-, &status, WNOHANG) > )
{
#if 0
printf("child process exit\n");
#endif
}
return;
} /*----------------------------------------------------------------- functionname: process_request
param: NA
return: NA
author: xxxx http request process
history:
create by xxxx, 2014.1.08, add simple abilities -----------------------------------------------------------------*/ void process_request(int connfd)
{
char request[MAX_REQUEST_LEN];
STR_REQUEST strreq;
EN_MIME_TYPE type = MIME_ELSE;
EN_REP_STATUS status = HTTP_END;
STR_RESP response;
long filesize = ;
FILE* fstream = NULL; bzero(&strreq, sizeof(STR_REQUEST));
bzero(request, sizeof(request));
bzero(&response, sizeof(STR_RESP)); if(recv(connfd, request, sizeof(request), ) >)
{ if(parse_request(request, &strreq) ==)
{
#if __DEBUG__
printf("request:%s\n", request);
#endif get_mime_type(strreq.URI,&type); // file does not exist 404
if(file_exist(strreq.URI) == -)
{
status = HTTP_NOT_FOUND;
fstream = fopen(HTML_404, "rb");
}else
{
status = HTTP_OK;
fstream = fopen(strreq.URI, "rb");
} filesize=get_file_size(fstream);
#if __DEBUG__
printf("request file size = [%ld]\n", filesize);
#endif
//response.data = (void*)malloc(filesize);
//bzero(response.data, filesize);
get_response_head(status,type,response.head,(int)filesize);
#if __DEBUG__
printf("response head = [%s]", response.head);
#endif
//if(get_response_body(type, response.data, strreq.URI, filesize) == -1)
// perror("fill response body failed"); #if __DEBUG__
//printf("response body = [%s]\n", (char*)(response.data));
#endif
fclose(fstream);
send(connfd, response.head, strlen(response.head), );
write_response_body(connfd, strreq.URI, (int)filesize);
shutdown(connfd, SHUT_RD);
close(connfd);
}
}
} static void write_response_body(int connfd, char* uri, int filesize)
{
int fd =;
void* bodybuf = NULL;
fd = open(uri, O_RDONLY, );
bodybuf = mmap(NULL, filesize, PROT_READ, MAP_PRIVATE, fd, );
send(connfd, bodybuf, filesize, );
munmap(bodybuf, filesize);
}

http server v0.1_http_server.c的更多相关文章

  1. http server v0.1_http_reponse.c

    #include <string.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl ...

  2. http server v0.1_http_parse.c

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include "mime.h&q ...

  3. http server v0.1_http_webapp.c

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  4. http server v0.1_mime.c

    #include <string.h> #include "mime.h" static STR_MIME_MAP mime_map[]= { MIME_MAP(MIM ...

  5. 用FileZilla Server开FTP

    FileZilla(教程)是经典的开源FTP解决方案,包括FileZilla客户端和FileZilla Server.其中,FileZilla Server的功能比起商业软件FTP Serv-U毫不逊 ...

  6. DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网

    我自己的命令: server端: dns2tcpd -F -d 1 -f ./dns2tcpd.conf 输出: 09:08:59 : Debug options.c:97 Add resource ...

  7. docker 下 安装rancher 笔记

    sudo yum update 更新系统环境 curl -sSL https://get.docker.com/ | sh 安装最新docker版本 systemctl start docker.se ...

  8. 容器基础(七): 使用docker compose部署程序

    配置 在上一节的基础上,  增加如下的docker-compose.yml文件, 然后用docker-compose up命令启动容器进行部署: version: " services: s ...

  9. 容器基础(八): 使用docker swarm部署程序

    环境 基于上一节的env/server:v0.1, env/worker:v0.1镜像, 在基于debian8.2的两台机器上测试部署docker swarm. docker service部署 ➜ ...

随机推荐

  1. 在storyboard中的静态UITableView中拖入 UISearchBar and Search Display Controller出现的奇怪问题

         近期学习过程中想模拟一下新浪微博"发现"界面.      我在storyboard中拖入一个UITableViewController,设置这个UITableViewCo ...

  2. Nginx平台构架 分类: Nginx 2015-07-13 10:55 205人阅读 评论(0) 收藏

    深入理解Nginx模块发开与架构解析读书笔记. nginx在启动后,在unix系统中会以daemon的方式(可以手动关闭 nginx.conf daemon off)在后台运行,后台进程包含一个mas ...

  3. There is an error while getting planid. No Free partitions available

    问题概述 Oracle Advanced Supply Chain Planning最初的设置职责的时候有点问题,不知是不是要打什么补丁或其它配置什么东东,, 这个提示,,但我查到的分区是还有可用分区 ...

  4. careercup-数组和字符串1.6

    1.6 给定一幅由N*N矩阵表示的如下,其中每个像素的大小为4个字节,编写一个方法,将图像旋转90度.不占用额外内存空间能否做到? 类似leetcode:Rotate Image 思路: 我们这里以逆 ...

  5. String类的基本用法与注意点,StringBuffer类的用法

    package cn.hncu.day8; public class RegExpDemo { public static void main(String[] args) { String str ...

  6. Linux系统ifconfig命令找不到,centos ifconfig Command not found

    centos ifconfig Command not found,Linux系统ifconfig命令找不到 >>>>>>>>>>>& ...

  7. DEDE自带的采集功能,标题太短的解决方法

    DEDE自带的采集功能,标题太短获取不全的解决方法搜索了好多之后,终于还是在dede的官方论坛找到了答案.增加采集标题长度:255  目的:原标题长度太小,影响文件采集⑴修改系统参数设置(文档标题最大 ...

  8. IE浏览器div错乱问题

    这个问题属于各浏览器的兼容问题,有时候在其他浏览器中,html页面布局都是正常显示,唯独IE浏览器的div块布局错乱了,可能是html文件上面的报头标准出现错误. 就是一段报头,告诉浏览器,你的文档以 ...

  9. JVM垃圾回收理论知识

  10. oracle数据库误删恢复方法

    一.如果只是误删部分数据或者某条数据可以通过 1.select * from 误删除的表明 as of timestamp to_Date('恢复年月日  时分秒', '恢复时间格式')       ...