webserver<2>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <errno.h>
#include "common.h"
#include "serversignal.h"
#include "server_epoll.h" static int open_socket(struct sockaddr_in* paddr);
static int accept_client(int sockfd, struct sockaddr_in* paddr); static int process_request(int connfd);
static volatile sig_atomic_t graceful=; #define HTTP_PORT 18080
#define BACK_LOG 50
#define MAX_FDS 100
#define SOCKLEN sizeof(struct sockaddr_in) #define err_log_exit()\
do{\
perror("server failed");\
fprintf(stderr, "file %s line %d\n", __FILE__, __LINE__);\
exit(EXIT_FAILURE);\
}while()\ #define err_msg_exit(msg)\
do{\
perror(msg);\
fprintf(stderr, "file %s line %d\n", __FILE__, __LINE__);\
exit(EXIT_FAILURE);\
}while()\ static int setnonblocking(int sockfd)
{
if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, )|O_NONBLOCK) == -)
{
return -;
} return ;
} int main(int argc, char *argv[])
{
signal_init();
int max_worker = ;
int child = ;
int epollfd = ;
struct sockaddr_in saddr;
int sockfd = ;
int nfds = ;
int index = ;
int fd = ;
int acceptfd = ;
struct epoll_event *events; memset(&saddr, , sizeof(struct sockaddr_in)); sockfd=open_socket(&saddr); if(sockfd == -)
err_log_exit(); while(!graceful&&!child){
if(max_worker>){
switch(fork()){
case -:
err_log_exit();
break;
case :
child =;
break;
default:
printf("child creat\n");
max_worker--;
break;
}
}else{
int status =;
if( - != wait(&status)){
//max_worker++;
fprintf(stderr, "child quit\n");
}
}
} if(!child){
fprintf(stderr, "before quit, kill all child\n");
kill(, SIGINT);
sleep();
return ;
} //child
epollfd = server_epoll_create(MAX_FDS+);
if(epollfd == -)
err_log_exit(); if(server_epoll_event_add(epollfd, sockfd) == -)
err_log_exit(); events = (struct epoll_event*)malloc(MAX_FDS*sizeof(struct epoll_event));
memset(events, , MAX_FDS*sizeof(struct epoll_event)); /* close stdin and stdout, as they are not needed */
/* move stdin to /dev/null */
if (- != (fd = open("/dev/null", O_RDONLY))) {
close(STDIN_FILENO);
dup2(fd, STDIN_FILENO);
close(fd);
} /* move stdout to /dev/null */
if (- != (fd = open("/dev/null", O_WRONLY))) {
close(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
close(fd);
} while(child&&!graceful){
nfds = epoll_wait(epollfd, events, MAX_FDS, );
index = ; while(index < nfds){ if(events[index].data.fd == sockfd){
acceptfd = accept_client(sockfd, &saddr);
//waking herd
if(acceptfd == -){
perror("accept failed\n");
}else{
//accept ok
if(server_epoll_event_add(epollfd, acceptfd) == -)
err_log_exit();
}
}else if(events[index].data.fd == acceptfd){
// receive data from client
// if client close, need avoid TIME_WAIT status
if(process_request(acceptfd) == ){
fprintf(stderr, "client close, close connection and quit listen connect fd\n");
if(server_epoll_event_del(epollfd, acceptfd) == -)
err_log_exit();
close(acceptfd);
}
}else{ }
index++;
}; if(nfds == -){
if (errno == EINTR)
continue;
else{
err_log_exit();
}
} }; return ;
} void server_graceful_set(int g)
{
if(g>){
g=;
}else{
g=;
}
graceful=g;
} int server_graceful_get()
{
return graceful;
} 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, )) == -)
err_log_exit(); sockaddress.sin_family = AF_INET;
sockaddress.sin_port = htons(HTTP_PORT); setnonblocking(sockfd); inet_pton(AF_INET, "10.174.8.163", &(sockaddress.sin_addr)); if(bind(sockfd, (struct sockaddr*)(&sockaddress), sizeof(sockaddress)) == -)
err_log_exit(); if(listen(sockfd, BACK_LOG) == -)
err_log_exit(); *paddr = sockaddress;
return sockfd;
} 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;
} static int process_request(int connfd)
{
char request[];
int len = ;
bzero(request, sizeof(request));
len = recv(connfd, request, sizeof(request), );
if(len >)
fprintf(stderr, "%s\n", request); return len;
}
#include <unistd.h>
#include <string.h>
#include "server_epoll.h" int server_epoll_event_add(int epollfd, int sockfd)
{
struct epoll_event ep;
memset(&ep, , sizeof(ep));
ep.events = ;
ep.events |= EPOLLIN;
ep.events |= EPOLLOUT;
ep.data.fd = sockfd; return epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &ep);
} int server_epoll_event_del(int epollfd, int sockfd)
{
struct epoll_event ep;
memset(&ep, , sizeof(ep));
ep.events = ;
ep.events |= EPOLLIN;
ep.events |= EPOLLOUT;
ep.data.fd = sockfd; return epoll_ctl(epollfd, EPOLL_CTL_DEL, sockfd, &ep);
} int server_epoll_create(int size)
{
int fd = epoll_create(size);
return fd;
} int server_epoll_close(int fd)
{
return close(fd);
}
webserver<2>的更多相关文章
- WebServer+ADO+百万数据查询
很简单的demo,查询速度快,易理解,废话不说 上demo 看完就明白了 源码地址:http://files.cnblogs.com/files/SpadeA/WebDemo.zip 这是关于Web ...
- webserver[实时查询当天的天气情况]
1.webserver是什么? 日常生活中经常会使用到webserver,注册时,会收到验证码,购买东西时,会收到短信,假如,A公司网站和B公司合作,那么A公司注册对的用户可以直接推送给B网站,那怎么 ...
- Warning: file_put_contents(data.txt): failed to open stream: Permission denied in /Library/WebServer/Documents/test.php on line 22
最近在学习PHP 在保存文件的时候报Warning: file_put_contents(data.txt): failed to open stream: Permission denied in ...
- [C#] 图文解说调用WebServer实例
本文旨在实现如何在.NET环境下调用WebServer,以天气接口为例进行说明. WebServer地址:http://www.webxml.com.cn/WebServices/WeatherWeb ...
- python开启简单webserver
python开启简单webserver linux下面使用 python -m SimpleHTTPServer 8000 windows下面使用上面的命令会报错,Python.Exe: No Mod ...
- C# 如何调用WebServer函数
WebServer(ASMX)服务程序网站的编写简单总结. WebServer中遇到的问题 编写WebServer程序VS运行调试时如果出现 System.Data.OracleClient.Orac ...
- [Top-Down Approach] Assignment 1: WebServer [Python]
Today I complete Socket Programming Assignment 1 Web Server Here is the code: #!/usr/bin/python2.7 # ...
- 【监控】WebServer入库与缓存更新代码优化小计
问题描述: 通过WebServer将监控数据入库到Hbase,在入库之前需要将指标与ip的列表更新到缓存中,以便前台页面随时选择查看.前两天上了一些新用户导致负载增加,逐渐发现某些用户的监控场景出现丢 ...
- Linux WebServer WebRoot Path Identification
目录 . HTTPD(Apache) . NGINX . TENGINE . JBOSS . TOMCAT . LIGHTTPD 1. HTTPD(Apache) 0x1: 启动参数 Usage: . ...
- iOS - Apache Tomcat WebServer 服务器配置
前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: apache-tomcat-6.0.45.tar.gz eclip ...
随机推荐
- 【转】以XML文件方式保存用户数据——2013-08-25 22
正在做项目中有很多游戏数据要保存,常见的玩家数据这些比较简单的可以用CCUserDefault.它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 主要方法:(和java的map很 ...
- leecode 每日解题思路 64 Minimum Path Sum
题目描述: 题目链接:64 Minimum Path Sum 问题是要求在一个全为正整数的 m X n 的矩阵中, 取一条从左上为起点, 走到右下为重点的路径, (前进方向只能向左或者向右),求一条所 ...
- dom4j中对xml的查增
package dom; import java.io.FileWriter;import java.util.Iterator; import org.dom4j.Document;import o ...
- Java IO学习笔记
Java流的分类,一般可按以下方式分: 按方向分,分为输入流,输出流. 按类型分,分为字节流和字符流. 2.1字节流是通过字节来读取数据 2.2字符流是通过字符来读取数据 按操作方式分,分为节点流和过 ...
- springmvc 双亲上下文导致的 No mapping found for HTTP request
今天搭建spring mvc ,结果发出请求总是No mapping found for HTTP request with URI [******] 于是开始排查了半天,后来在网上搜到了双亲上下文的 ...
- Find Security Bugs研究,邀请志同道合者一起参与
Find Security Bugs研究,邀请志同道合者一起参与http://automationqa.com/forum.php?mod=viewthread&tid=2803&fr ...
- js函数、表单验证
惊天bug!!!在script里面只要有一点点错误,就都不执行了!!!所以每写一个方法,就跑一下,因为这个书写疏忽导致的bug不可估量!!! [笑哭,所以我才这么讨厌js么,后来真心的是一点都不想再看 ...
- maven项目在tomcat中运行遇到的问题
在使用maven构建项目,并在tomcat容器中运行的时候遇到了一些问题,现做一下记录 maven项目中jdk版本会自动恢复 maven项目的编译jdk即使在window -> java -&g ...
- Java中的编码问题
下面将侧重介绍java乱码是如何产生的.存在哪些乱码的情况.该如何从根本上解决乱码问题.各位随博主一起征服令人厌烦的java乱码问题吧!!! 一.Java编码转换过程 我们总是用一个java类文件和用 ...
- 技术QQ群
欢迎加入moss技术交流群. 欢迎加入微信技术交流群.