[linux] c 实现简单的web服务器
2016-11-29 14:50
513 查看
web.c
运行服务器:
gcc web.c wrap.c -o web
./web
在浏览器中输入:
http://127.0.0.1:8000
注:wrap.h 在 http://blog.csdn.net/tzshlyt/article/details/53229878 这里提到。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <ctype.h> #include <signal.h> #include <sys/wait.h> #include "wrap.h" #define BUFF_SIZE 1024 #define SERV_PORT 8000 void handle_sig(int sig) { printf("child exit\n"); wait(NULL); } char *http_res_tmpl = "HTTP/1.1 200 OK\r\n" "Server: Cleey's Server V1.0\r\n" "Accept-Ranges: bytes\r\n" "Content-Length: %d\r\n" "Connection: close\r\n" "Content-Type: %s\r\n\r\n"; void http_send(int sock_client,char *content){ char HTTP_HEADER[BUFF_SIZE],HTTP_INFO[BUFF_SIZE]; int len = strlen(content); sprintf(HTTP_HEADER,http_res_tmpl,len,"text/html"); len = sprintf(HTTP_INFO,"%s%s",HTTP_HEADER,content); Write(sock_client,HTTP_INFO,len); } int main(void) { struct sockaddr_in servaddr, cliaddr; socklen_t cliaddr_len; int listenfd, connfd; char buf[BUFF_SIZE]; char str[INET_ADDRSTRLEN]; int i, n; struct sigaction act; act.sa_handler = handle_sig; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGCHLD,&act,NULL); listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); int opt = 1; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); Bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); Listen(listenfd, 20); printf("Accepting connections ...\n"); while(1) { cliaddr_len = sizeof(cliaddr); connfd = Accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len); n = fork(); if ( n == -1) { perror("call to fork"); exit(1); } else if (n == 0) { // child Close(listenfd); n = Read(connfd, buf, BUFF_SIZE); if (n == 0) { printf("the other side has been closed.\n"); break; } printf("received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port)); fputs(buf, stdout); http_send(connfd, "hello world!"); Close(connfd); exit(0); } else { // parent Close(connfd); } } }
运行服务器:
gcc web.c wrap.c -o web
./web
在浏览器中输入:
http://127.0.0.1:8000
注:wrap.h 在 http://blog.csdn.net/tzshlyt/article/details/53229878 这里提到。
相关文章推荐
- 用C语言实现的简单Web服务器(Linux)
- 用C语言实现的简单Web服务器(Linux)
- 用C语言实现的简单Web服务器(Linux)
- 类似于电信弹出广告(push业务),使用ROS与简单web服务器实现
- C#实现简单WEB服务器
- 用java 实现一个简单的web 服务器
- 使用Twisted实现一个简单Web服务器
- twisted 实现简单的web服务器
- Linux网络编程:一个简单的正向代理服务器的实现
- 【简单Web服务器搭建】基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
- (转)使用HttpListener实现简单Web服务器
- 启动Linux 的时候实现oracle数据库与Tomcat web服务器与操作系统一同关闭与启动
- Linux 网络编程基础(一) ---------------客户端/服务器的简单实现
- 关于类似于电信弹出广告(push业务),使用ROS与简单web服务器实现
- 用java实现的一个简单web服务器程序
- Linux 下 ftp 服务器 vsftpd 安装与简单配置 实现匿名上传下载
- 嵌入式linux简单Web服务器 之 课设一周总结
- 使用HttpListener实现简单Web服务器
- Linux 网络编程基础---------------客户端/服务器的简单实现