博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[linux] c 实现简单的web服务器
阅读量:4250 次
发布时间:2019-05-26

本文共 2136 字,大约阅读时间需要 7 分钟。

web.c

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "wrap.h"#define BUFF_SIZE 1024#define SERV_PORT 8000void 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 这里提到。

你可能感兴趣的文章
java读取文件
查看>>
【二叉树】二叉树打印
查看>>
【字符串】字符串逆序
查看>>
【字符串】判断两字符串是否互为旋转词?
查看>>
【排序】时间复杂度为O(N^2)的排序——冒泡、选择和插入排序
查看>>
Typora Markdown 语法
查看>>
【IO】程序访问文件的几种方式
查看>>
Java NIO 系列教程
查看>>
fork() || fork()和fork() && fork()笔试题
查看>>
Qt:事件处理
查看>>
sublime Text3使用笔记
查看>>
使用webstom或者idea上传代码到github或coding
查看>>
YAML 语法
查看>>
AES加密
查看>>
使用Github进行合作开发
查看>>
Hadoop常用命令
查看>>
Impala入门笔记(转载)
查看>>
大数据分析:机器学习算法实现的演化
查看>>
自学大数据:用以生产环境的Hadoop版本比较
查看>>
Cloudera Manager和Managed Service的数据库
查看>>