首先编写我们服务器上需要的c文件WebServer.c

涉及到的函数API:

  int copy(FILE *read_f, FILE * write_f) ----- 文件内容复制的方法

  int DoHTML(FILE *f, char * name) ------ socket通讯文件发送的重要方法,阐述出了socket编程中的send函数和recv函数的机理!!

  int ParseReq(FILE *f, char *r) -----文件字符串解析的重要方法

  int HandleConnect(int fd)

  void * key(void *data)

 #include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h> int KEY_QUIT = ;
char referrer[]={};
int content_length=;
#define SERVER_PORT 80
static char copybuf[]={};
#define DEBUG 1 int copy(FILE *read_f, FILE * write_f) //复制文本的API函数copy
{
int n;
int wrote;
n = fread(copybuf,,sizeof(copybuf),read_f);
wrote = fwrite(copybuf,n,,write_f);
return ;
} int DoHTML(FILE *f, char * name)
{
FILE *infile;
infile = fopen(name,"r"); //打开本地Client端请求的html文件,文件名为name printf("Sending mesg...\n");
copy(infile,f); //复制Client客户端请求的html文件
printf("Complete sending.\n");
fread(copybuf,,sizeof(copybuf),f);
fclose(infile);
return ;
} int ParseReq(FILE *f, char *r) //分析处理请求文件流当中的内容提取请求的文件名index.html
{
char *bp;
char *c;
#ifdef DEBUG
printf("req is %s", r); //请求的内容例如: GET /index.html HTTP/1.1
#endif
while(*(++r) != ' '); //去掉请求内容开头所有的空格部分
while(isspace(*r)) r++; //判断输入字符是否为空格/回车/制表符等,去掉所有的这些字符
while(*r == '/') r++; //去掉所有的'/'字符
bp = r; //得到文件名的起始指针
while(*r && (*r != ' ') && (*r != '?')) r++;
*r = ;
c = bp;
printf("The Request FileName is %s\n", c);
DoHTML(f, c); //得到文件名之后处理请求的操作
return ;
} int HandleConnect(int fd)
{
FILE *f;
char buf[];
f = fdopen(fd, "a+"); //打开对应文件名的html文件
setbuf(f, ); //清楚f文件缓存区
fgets(buf, , f); //从Client端请求中获取前面150个字符
#ifdef DEBUG
printf("buf is %s", buf);
#endif
ParseReq(f, buf); //分析请求的内容
fflush(f); //清空文件缓冲区,将其内容写入文件
fclose(f);
return ;
} void * key(void *data)
{
int c;
for(;;)
{
c = getchar();
if(c == 'q'||c == 'Q')
{
KEY_QUIT = ;
exit();
break;
}
}
} int main(int argc, char *argv[])
{
int fd,sockfd;
int len;
volatile int true = ;
struct sockaddr_in ec;
struct sockaddr_in server_sockaddr;
pthread_t th_key;
printf("Starting httpd...\n");
printf("press q to quit..\n"); sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,(void*)&true,sizeof(true));
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(SERVER_PORT);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr));
listen(sockfd,*); pthread_create(&th_key,NULL,key,); printf("Wait for connection....\n");
while()
{
len = sizeof(ec);
if((fd=accept(sockfd,(void *)&ec,&len)) == -)
{
exit();
close(sockfd);
}
printf("Handle Connection...\n");
HandleConnect(fd);
}
}

编写需要的Makefile文件,注意M是大写

server:WebServer.c
gcc -o server WebServer.c -lpthread
clean:
rm server

添加我们的html文件,例如取名index.html,文件的内容如下所示:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!This is my first Web Project!Author MM1994UESTC</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
</body>
</html>

接下来就是运行我们的server文件,主要要使用sudo权限或者root权限来执行server文件:

sudo ./server

下面打开浏览器输入对应的主机的IP地址加上文件名称如:192.168.1.125/index.html

 

完~

基于C语言的Socket网络编程搭建简易的Web服务器(socket实现的内部原理)的更多相关文章

  1. GitHub的实现是否是基于此语言的支持网络编程性呢?

    我觉好像是的,我之前很奇怪为什么那样就可以引用了,后来发现GitHub中的java  JavaScript  phton等语言都支持网络编程.

  2. 基于python2【重要】怎么自行搭建简单的web服务器

    基本流程:1.需要的支持     1)python本身有SimpleHTTPServer     2)ForkStaticServer.py支持,该文件放在python7目录下     3)将希望共享 ...

  3. Socket网络编程--FTP客户端(60篇socket博客,而且都比较简单、深入浅出)

    已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...

  4. Go语言练习:网络编程实例——简易图片上传网站

    1.代码结构 2.运行实例 1.代码结构 $ tree . ├── photoweb.go ├── public │   ├── css │   ├── images │   └── js ├── u ...

  5. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  6. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  7. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

  8. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...

  9. 用go-module作为包管理器搭建go的web服务器

    本篇博客主要介绍了如何从零开始,使用Go Module作为依赖管理,基于Gin来一步一步搭建Go的Web服务器.并使用Endless来使服务器平滑重启,使用Swagger来自动生成Api文档. 源码在 ...

随机推荐

  1. 洛谷P4630 [APIO2018]铁人两项 [广义圆方树]

    传送门 又学会了一个新东西好开心呢~ 思路 显然,假如枚举了起始点\(x\)和终止点\(y\),中转点就必须在它们之间的简单路径上. 不知为何想到了圆方树,可以发现,如果把方点的权值记为双联通分量的大 ...

  2. winform无需安装pdf阅读器打开pdf文件

    控件来源:http://www.o2sol.com/pdfview4net/download.htm (使用版本:2016年8月31号更新版) 备份链接: https://pan.baidu.com/ ...

  3. leetcode(js)算法605之种花问题

    假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花 ...

  4. django中数据库的配置及相关增删改查

    ORM ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 类名对应---- ...

  5. python冒泡排序法

  6. laravel 资源控制器

    Artisan 生成器来生成一个资源控制器(在之前命名后加上 --resource 选项) php artisan make:controller PostController --resource ...

  7. poj3107树的重心

    /*树的重心求法:两次dfs,第一次dfs处理出每个结点的size,以此求每个结点大儿子的size,第二次dfs将每个结点大儿子的size和余下结点数进行比较,所有结点里两个值之间差值最小的那个点就是 ...

  8. 集腋成裘-03-css基础-02

    1.1 三种写法 内嵌式:样式只作用于当前文件,没有真正实现结构表现分离 外链式:作用范围是当前站点,真正实现了内容与表现分离 行内样式:仅限于当前标签,结构混在一起 1.2 标签分类 1.2.1 块 ...

  9. Spring.Net 简单实例-01(IOC)

    1.话不多说看操作.新建"Windows窗体应用程序" 2:通过配置文件创建IOC容器 首先引入安装包 3:定义一个接口(更好的体现封装性,当然也可以直接使用类) 定义一个类,实现 ...

  10. python指定分隔符来分割文件

    1 import re 2 p = re.compile('AAAAAAAA',re.S) 3 f = open(r"D:\test\oldfile.txt","r&qu ...