#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>的更多相关文章

  1. WebServer+ADO+百万数据查询

    很简单的demo,查询速度快,易理解,废话不说  上demo 看完就明白了 源码地址:http://files.cnblogs.com/files/SpadeA/WebDemo.zip 这是关于Web ...

  2. webserver[实时查询当天的天气情况]

    1.webserver是什么? 日常生活中经常会使用到webserver,注册时,会收到验证码,购买东西时,会收到短信,假如,A公司网站和B公司合作,那么A公司注册对的用户可以直接推送给B网站,那怎么 ...

  3. 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 ...

  4. [C#] 图文解说调用WebServer实例

    本文旨在实现如何在.NET环境下调用WebServer,以天气接口为例进行说明. WebServer地址:http://www.webxml.com.cn/WebServices/WeatherWeb ...

  5. python开启简单webserver

    python开启简单webserver linux下面使用 python -m SimpleHTTPServer 8000 windows下面使用上面的命令会报错,Python.Exe: No Mod ...

  6. C# 如何调用WebServer函数

    WebServer(ASMX)服务程序网站的编写简单总结. WebServer中遇到的问题 编写WebServer程序VS运行调试时如果出现 System.Data.OracleClient.Orac ...

  7. [Top-Down Approach] Assignment 1: WebServer [Python]

    Today I complete Socket Programming Assignment 1 Web Server Here is the code: #!/usr/bin/python2.7 # ...

  8. 【监控】WebServer入库与缓存更新代码优化小计

    问题描述: 通过WebServer将监控数据入库到Hbase,在入库之前需要将指标与ip的列表更新到缓存中,以便前台页面随时选择查看.前两天上了一些新用户导致负载增加,逐渐发现某些用户的监控场景出现丢 ...

  9. Linux WebServer WebRoot Path Identification

    目录 . HTTPD(Apache) . NGINX . TENGINE . JBOSS . TOMCAT . LIGHTTPD 1. HTTPD(Apache) 0x1: 启动参数 Usage: . ...

  10. iOS - Apache Tomcat WebServer 服务器配置

    前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: apache-tomcat-6.0.45.tar.gz eclip ...

随机推荐

  1. 常用数据库的驱动类/URL/默认端口

    常用数据库的驱动类/URL/默认端口 1.Oracle:     格式:     驱动:oracle.jdbc.driver.OracleDriver     URL:jdbc:oracle:thin ...

  2. android 换肤模式总结

    由于Android的设置中并没有夜间模式的选项,对于喜欢睡前玩手机的用户,只能简单的调节手机屏幕亮度来改善体验.目前越来越多的应用开始把夜间模式加到自家应用中,没准不久google也会把这项功能添加到 ...

  3. BULK INSERT将CSV或TXT文件导入到SQL Server

    CSV代表逗号分隔值,有时也被称为逗号分隔的值.而 如果加载txt文件,然后文件应该有逗号分隔的值.和文件应该是这样 下面是该脚本以创建表: CREATE TABLE Employee( Id int ...

  4. C++学习(二)

    九.3.内联1)编译器用函数的二进制代码替换函数调用语句,减少函数调用的时间开销.这种优化策略成为内联.2)频繁调用的简单函数适合内联,而稀少调用的复杂函数不适合内联.3)递归函数无法内联.4)通过i ...

  5. LSJ_NHibernate第一章 NHibernate介绍

    前言: 说起NHibernate网上资料真不少,但用的人却并不多,说起java的SSH框架大家可能就知道了,这里的H指的就是Hibernate,一款好用的ORM框架,在.net重写了这款好用的框架,名 ...

  6. Android adapter适配器的使用

    说起Adapter的使用,首先想到的就是listview或各种各样的Adapter.下面我们对常用的一些Adapter进行简单的使用讲解. 这是Adapter的关系图: 下面的所有例子均使用同一个布局 ...

  7. Spring.net架构示例(含Aop和Ioc)源码

    最近写了一个Spring.net的架构. 一.架构主图 架构图的数据流程走向是: UI层=>UILogic>=>Service>Business=>DataAccess ...

  8. Ztree使用

    基础: <link rel="stylesheet" href="../../../css/zTreeStyle/zTreeStyle.css" type ...

  9. Ext.Net学习笔记04:Ext.Net布局

    ExtJS中的布局功能很强大,常用的布局有border.accordion.fit.hbox.vbox等,Ext.Net除了将这些布局进行封装以外,更是对border进行了一些非常实用的改进,让我们来 ...

  10. Codevs 1066 引水入城 2010年NOIP全国联赛提高组

    1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...