#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. 编译错误ERROR C2027

    一个工程编译时出错! 费了很多时间,增加头文件都不可取,然后把source File文件下分的.cpp文件删除,然后编译通过.

  2. Linux磁盘挂载、分区、扩容操作

    本文最早发布于 Rootrl's blog 注:以下操作系统环境为CentOS7 基本概念 在操作前,首先要了解一些基本概念 磁盘 在Linux系统中所有的设备都会以文件的形式存储.设备一般保存在/d ...

  3. 本地代码库,提交远程git

    1.在git上新建项目,并填好相关信息 2.新建成功后,复制项目地址 3.idea新建本地仓库 4.Add所有文件,然后提交(commit) 5.先打开push界面,设置git远程地址,然后关掉,先p ...

  4. linux 下用find命令查找文件,rm命令删除文件

    linux 下用find命令查找文件,rm命令删除文件. 删除指定目录下指定文件find 要查找的目录名 -name .svn |xargs rm -rf 删除指定名称的文件或文件夹: find -t ...

  5. Collections 类和Arrays类常用方法详解

    1:Collections类 max(Collection <? extends T> coll):根据元素的自然顺序,返回给定集合元素中的最大元素 min(Collection < ...

  6. 《深入实践C++模板编程》之六——标准库中的容器

    1.容器的基本要求 a.并非所有的数据都可以放进容器当中.各种容器模板对所存数据类型都有一个基本要求——可复制构造.将数据放进容器的过程就是通过数据的复制构造函数在容器内创建数据的一个副本的过程. b ...

  7. JS基础_if练习三

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. ZROI-Day2比赛解题报告

    ZROIDay2-比赛解题报告 版权原因不提供题面信息 序 这几天作息有点鬼畜,虽然昨晚很晚睡但是早上精神还不错,看到题发现T1很友好?T2woc这暴力都好难打?T3多项式?!这样下去比赛会不会出现更 ...

  9. vue 数据驱动原理,响应式 原理?

    Object.defineProperty(obj,"name",{ get(){ console.log("被访问了") return obox.innerH ...

  10. 第十章、logging模块

    目录 第十章.logging模块 一.logging模块及日志框架 第十章.logging模块 一.logging模块及日志框架 导入方式 import logging 作用 写日志 模块功能 # V ...