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] ...
随机推荐
- DL4J中文文档/Keras模型导入/函数模型
导入Keras函数模型 假设使用Keras的函数API开始定义一个简单的MLP: from keras.models import Model from keras.layers import Den ...
- Ruby Rails学习中:Sass 和 Asset Pipeline,布局中的链接(Rails路由,具名路由),用户注册: 第一步
接上篇: 一.Sass 和 Asset Pipeline Rails 中最有用的功能之一是 Asset Pipeline, 它极大地简化了静态资源文件(CSS.JavaScript 和图像)的生成和管 ...
- 网易Java程序员两轮面试,这些问题你能答对几个?
一转眼,2018 年已经过去了,你是否在满意的公司?拿着理想的薪水? 虽然"钱多.事少.离家近"的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难.但是,有些 ...
- 并不对劲的CF1239B&C&D Programming Task in the Train to Catowice City
CF1239B The World Is Just a Programming Task 题目描述 定义一个括号序列s是优秀的,当且仅当它是以下几种情况的一种: 1.|s|=0 2.s='('+t+' ...
- Windows authentication for WCF web services error
WCF Web服务的Windows身份验证在部署到IIS时,默认网站添加应用程序的方式.浏览运行.svc文件报错. 错误代码: The authentication schemes configure ...
- PowerBI 实现不同角色看到内容不同支持动态权限管理
首先,在PowerBIDesktop中进行设计,先设计一个权限表: 具体权限如下: 也就是说,这些用户账号在PowerBIService登录时,会分别代表这些用户,接下来会使用一个很重要的动态函数:U ...
- unity 3D循环滚动效果
https://blog.csdn.net/qinyuanpei/article/details/52765356 https://blog.csdn.net/chongzi_daima/articl ...
- jquery选择器 模糊查找
$("input[class^='combo-text']").attr("readonly", "readonly"); 查找包含‘com ...
- linq多个条件
public static class PredicateBuilder { /// <summary> /// 机关函数应用True时:单个AND有效,多个AND有效:单个OR无效,多个 ...
- 题解 P2661 【信息传递】
首先介绍个概念:基环外向树,也叫环加外向树,环基树,章鱼图. 这就是一颗基环外向树. 不难发现,若基环外向树有n个结点就有n条边,这也意味 着它不是颗普通的树,而是必定有一个自环. 再看看题目中的介绍 ...