C语言构建小型Web服务器
#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服务器的更多相关文章
- MINI_httpd移植,构建小型WEB服务器
一.简介 目的:构建小型WEB站,具备SSL. mini_httpd is a small HTTP server. Its performance is not great, but for low ...
- HttpListener 实现小型web服务器
HttpListener 实现web服务器 用于小型服务器,简单.方便.不需要部署. 总共代码量不超过50行. static void Main(string[] args) { //创建HTTP监听 ...
- C语言实现的Web服务器(转-kungstriving)
自己研究了好几天终于写出来一个,哈哈,当然也从网上得到了很多的帮助拉.谢谢大家咯!这个版本还不是很完善,但Web服务器的基本框架已经出来了,还有部分的功能需要进行进一步的测试和修改.虽然说C的开发比较 ...
- 构建Apache Web服务器
Apache 是世界使用排名第一的 Web 服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一.Apache工作模式有多种,其 ...
- Tiny server:小型Web服务器
一.背景 csapp的网络编程粗略的介绍了关于网络编程的一些知识,在最后的一节主要就实现了一个小型的Webserver.这个server名叫Tiny,它是一个小型的可是功能齐全的Webserver.在 ...
- 小型web服务器thttpd的学习总结(上)
1.软件的主要架构 软件的文件布局比较清晰,主要分为6个模块,主模块是thttpd.c文件,这个文件中包含了web server的主要逻辑,并调用了其他模块的函数.其他的5个模块都是单一的功能模块,之 ...
- 构建apache web 服务器
一.Apache服务器工作模式 1.Prefork模式:Prefork MPM使用多个子进程,每个子进程只有一个线程,每个进程在某个确定的时间只能维护一个连接 2.Worker模式: Worker M ...
- 用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰
服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输 ...
- 小型web服务器thttpd的学习总结(下)
1.主函数模块分析 对于主函数而言,概括来说主要做了三点内容,也就是初始化系统,进行系统大循环,退出系统.下面主要简单阐述下在这三个部分,又做了哪些工作呢. 初始化系统 拿出程序的名字(argv[0] ...
随机推荐
- 二项式反演/minmax容斥初探
世界是物质的,物质是运动的,运动是有规律的,规律是可以被认识的 二项式反演 \[ g_n=\sum_{i=0}^n \binom{n}if_i\Rightarrow f_n=\sum_{i=0}^n( ...
- 小白简单快速搭建lnmp环境(centos7)
本来想着自己搭建lnmp,由于php包下载不下来因此这次本人使用的lnmp一键包搭建的环境(很遗憾还没有php7.3.5)很详细并且方便快捷网址https://lnmp.org/install.htm ...
- 位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题
转自:https://blog.csdn.net/monster_girl/article/details/52928864 在学习完位操作后,经常会遇到一类关于查找缺失整数的问题. 第一类是给你一个 ...
- Cannot call sendRedirect() after the response has been committed的解决办法
做一个Login Demo的时候,写了如下代码: protected void doPost(HttpServletRequest request, HttpServletResponse respo ...
- eclipse中ctrl+1什么意思
eclipse中ctrl+1是一个快捷键,能快速的现实光标所在行的问题,并给出一些修改方案. 当eclipse编辑器在你编辑代码阶段,能检测到编辑时异常(错误)会在错误代码行前面出现一个红色的叉叉,这 ...
- 在javascript中:(函数()()是一个匿名函数
在javascript中:(函数()()是一个匿名函数,它主要使用函数中的变量范围来避免全局变量,影响整个页面环境,并提高代码兼容性. (函数())是标准函数定义,但不会复制到任何变量.所以有一个没有 ...
- 云端js动态效果
效果图: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- DevOps与Kubernetes 、容器的关系
近两年,随着容器.Kubernetes 等技术的兴起,DevOps 这个概念被广泛提及并被大量使用. 本文将会从以下几个方面着手,结合实验展现的方式,让读者真正理解 DevOps 的含义. DevOp ...
- 如何判断kbmMWClientQuery当前记录的增改状态?
有朋友问我,客户端使用了kbmMWClientQuery,对其进行了编辑后,对于指定的记录,如何判断是否是增加的记录,或者是被修改后的记录? 下面这个函数,返回aDataSet当前记录的修改状态: f ...
- Java学习笔记【三、运算符、表达式、语句】
运算符 算数运算符 /* / % ++ -- 关系运算符 == != > /< >= /<= 位运算符 &(按位与,有0是0,否则1) |(按位或,有1是1,否则0) ...