#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <zconf.h> #define PORT 8080 // 服务器监听端口
#define MAX_QUEUE 5 // 待连接的队列最大数
#define MAX_LEN 1024 // 接收浏览器数据 int main(){
int server_socket_fp; // 服务端socket句柄
struct sockaddr_in server_addr; // 地址结构体
char buff[MAX_LEN]; /**
* 创建socket
* AF_INET: IPV4网络操作
* SOCK_STREAM: 使用TCP协议传输数据
* 0: 自动选择协议
*/
if ((server_socket_fp = socket(AF_INET, SOCK_STREAM, )) == -) {
printf("create socket failed");
exit(EXIT_FAILURE);
} /**
* 将socket与地址绑定
* bind参数:
* socket描述符
* 地址结构体,需要强转成struct sockaddr类型
* 结构体长度,传入的是指针,无法再函数内部获取长度
*/
memset(&server_addr, , sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // INADDR_ANY表示任何地址访问都可以
server_addr.sin_port = htons(PORT); // 端口号
if (bind(server_socket_fp, (struct sockaddr *) &server_addr, sizeof(server_addr)) < ) {
printf("bind socket with addr struct failed!");
exit(EXIT_FAILURE);
} /**
* 监听链接
* 参数:
* socket描述符
* 待连接队列的最大个数,一般为5
*/
listen(server_socket_fp, MAX_QUEUE); /**
* 与客户端建立连接
* 参数:
* socket文件描述符
* 客户端地址信息的结构体,不关心可以传NULL
* 客户端地址长度,不关心可以传NULL
* 返回值:
* socket文件描述符,在与客户端建立连接后,accpet还是会生成一个专门用于和当前客户端通信的socket,
* 而原来那个socket照常负责和其他等待建立连接的客户端建立通信
*/
int client_socket_fp = accept(server_socket_fp, NULL, NULL); /**
* 读取浏览器的内容
* 参数:
* 文件描述符,从哪个文件读,这里填写accept返回的文件句柄
* 读的内容存到buff中
* 共读多少个字节
*/
read(client_socket_fp, buff, MAX_LEN);
printf("%s", buff); /**
* 向浏览器写入内容
* 参数:
* 文件描述符,往哪个文件写,这里填写accept返回的文件句柄
* 内容的首地址
* 共读多少个字节
*/
char status[] = "HTTP/1.0 200 OK\r\n";
char header[] = "Server: DWBServer\r\nContent-Type: text/html;charset=utf-8\r\n\r\n";
char body[] = "<html><head><title>C语言构建小型Web服务器</title></head><body><h2>欢迎</h2><p>Hello,World</p></body></html>"; write(client_socket_fp, status, sizeof(status));
write(client_socket_fp, header, sizeof(header));
write(client_socket_fp, body, sizeof(body)); close(client_socket_fp);
close(server_socket_fp);
return ;
}

原文:https://www.jianshu.com/p/592b631e1ff1

C语言构建小型Web服务器的更多相关文章

  1. MINI_httpd移植,构建小型WEB服务器

    一.简介 目的:构建小型WEB站,具备SSL. mini_httpd is a small HTTP server. Its performance is not great, but for low ...

  2. HttpListener 实现小型web服务器

    HttpListener 实现web服务器 用于小型服务器,简单.方便.不需要部署. 总共代码量不超过50行. static void Main(string[] args) { //创建HTTP监听 ...

  3. C语言实现的Web服务器(转-kungstriving)

    自己研究了好几天终于写出来一个,哈哈,当然也从网上得到了很多的帮助拉.谢谢大家咯!这个版本还不是很完善,但Web服务器的基本框架已经出来了,还有部分的功能需要进行进一步的测试和修改.虽然说C的开发比较 ...

  4. 构建Apache Web服务器

    Apache 是世界使用排名第一的 Web 服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一.Apache工作模式有多种,其 ...

  5. Tiny server:小型Web服务器

    一.背景 csapp的网络编程粗略的介绍了关于网络编程的一些知识,在最后的一节主要就实现了一个小型的Webserver.这个server名叫Tiny,它是一个小型的可是功能齐全的Webserver.在 ...

  6. 小型web服务器thttpd的学习总结(上)

    1.软件的主要架构 软件的文件布局比较清晰,主要分为6个模块,主模块是thttpd.c文件,这个文件中包含了web server的主要逻辑,并调用了其他模块的函数.其他的5个模块都是单一的功能模块,之 ...

  7. 构建apache web 服务器

    一.Apache服务器工作模式 1.Prefork模式:Prefork MPM使用多个子进程,每个子进程只有一个线程,每个进程在某个确定的时间只能维护一个连接 2.Worker模式: Worker M ...

  8. 用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰

    服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输 ...

  9. 小型web服务器thttpd的学习总结(下)

    1.主函数模块分析 对于主函数而言,概括来说主要做了三点内容,也就是初始化系统,进行系统大循环,退出系统.下面主要简单阐述下在这三个部分,又做了哪些工作呢. 初始化系统 拿出程序的名字(argv[0] ...

随机推荐

  1. spring-boot war包部署(二)

    环境 jdk 8 tomcat 8.5 sts 4.4.2 maven 3.6.1 背景 有时候,服务器已经有了,我们必须要使用 war 包进行部署,所以需要 spring boot 支持打包和部署成 ...

  2. 对Android应用签名

    Android使用包名作为唯一标识,当在同一台手机安装两个包名相同的应用,后安装的应用就会覆盖前面的应用(签名相同的情况下). 签名有两个主要作用: 1.确定发布者身份.由于应用开发者可以通过使用相同 ...

  3. 【Life】 今天的思考

    今天一个实习生来问我问题,他要用python操作outlook发送邮件,代码是从网上找的. 在其他人的电脑上可以成功运行,但在他的电脑上就失败. 处理过程 (1)我查看了他method里的代码, 发现 ...

  4. 【openpyxl】 关于 单元格背景色 的疑惑

    openpyxl   优点: 对文件进行操作, 也就是说: 如果一台电脑 没有Office excel 或 WPS excel, xlsx 是打不开的,会提示你选择程序打开.   但这时    ope ...

  5. 基于从库+binlog方式恢复数据

    基于从库+binlog方式恢复数据 将bkxt从库的全备份在rescs5上恢复一份,恢复到6306端口,用cmdb操作 恢复全备后执行如下操作 set global read_only=OFF; st ...

  6. CF 666C & 牛客 36D

    给定字符串S, 求有多少长为$n$的字符串T, 使得S为T的子序列. 可以得到转移矩阵为 $\begin{equation}A=\begin{bmatrix}25 & 0 & 0 &a ...

  7. 异常-try...catch的方式处理异常2

    package cn.itcast_02; /* * A:一个异常 * B:二个异常的处理 * a:每一个写一个try...catch * b:写一个try,多个catch * try{ * ... ...

  8. Yali7月集训Contest2 T1 Cube 题解

    题目链接: 连我们都只有纸质题目...话说雅礼集训都是这样的吗... 大意 0维基本图形是一个点 1维基本图形是一条线段 2维基本图形是一个正方形 3维基本图形是一个正方体 4维基本图形是... 求\ ...

  9. dva中的一些备忘

    dva/router就是react-router-dom dva/router里的routerRedux就是react-router-redux 一个react的单页面应用: 编写一个基础框架,包含单 ...

  10. winfrom---Window 消息大全

    最近正在捣腾winfrom,遇到了关于window消息这一块的东西,正好在网上看到“微wx笑”的总结. 原文地址:http://blog.csdn.net/testcs_dn/article/deta ...