#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. Oracle-DQL 6- 子查询

    子查询: --查询emp表中工资高于allen的员工信息SELECT sal FROM empWHERE ename = 'ALLEN'; SELECT * FROM empWHERE sal > ...

  2. DEDE升级5.7版本后生成页面空白_解…

    今天将DEDECMS V5.6升级到DEDECMS V5.7并升级5.7 SP1后,发现生成首页.栏目.内容页均为空白,没有任何反应,今天发布一个解决方法. 发现每个模板中调用过 Html2Text ...

  3. C# struct结构知识总结

    结构是一种值类型,使用struct关键字定义. 结构可以包含字段.常量.事件.属性.方法.构造函数.索引器.运算符和嵌套类型.但若结构中同时需要上述所有成员,应考虑将结构改为类. 嵌套类型:在类或构造 ...

  4. [转载]深入理解maven构建生命周期和各种plugin插件

    我就不复制博主文章了,到原文地址看吧.写这个只是为了自己搜索起来方便些: https://blog.csdn.net/zhaojianting/article/details/80321488 htt ...

  5. qq快捷打开聊天窗口的代码

    pc代码: http://wpa.qq.com/msgrd?v=3&uin=8423291&site=qq&menu=yes

  6. java ftp retrieveFile 较大文件丢失内容

    今天发现用  如下方法下载一个2.2M的zip文件但是只下载了500K没有下载完全,但是方法  返回的却是true boolean org.apache.commons.net.ftp.FTPClie ...

  7. javascript框架(库)

    javascript框架(库)高级JavaScript编程,尤其是复杂的浏览器差异处理,通常是困难和耗时的.为了响应这些调整,出现了许多javascript(helper)库.这些JavaScript ...

  8. http://www.moext.com博客搬家到这里啦

    1.原博客莫叉特用的是自己的域名http://www.moext.com,由于服务器在国外,访问不太稳定,SEO做得也很不好: 2.喜欢博客园的极简风格,目前来看广告量也在可接受范围: 3.一个偶然的 ...

  9. mysql 触发器 if then elseif else 的运用

    create procedure dbname.proc_getGrade (stu_no varchar(20),cour_no varchar(10)) BEGIN declare stu_gra ...

  10. Java经典基础与高级面试36题和答案

    1.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实 ...