首先编写我们服务器上需要的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. 洛谷P5072 [Ynoi2015]盼君勿忘 [莫队]

    传送门 辣鸡卡常题目浪费我一下午-- 思路 显然是一道莫队. 假设区间长度为\(len\),\(x\)的出现次数为\(k\),那么\(x\)的贡献就是\(x(2^{len-k}(2^k-1))\),即 ...

  2. a标签的4种状态及设置CSS

    a:link 超链接的默认样式 a:visited 访问过的(已经看过的)链接样式 a:hover 鼠标处于鼠标悬停状态的链接样式 a:active 当鼠标左键按下时,被激活(就是鼠标按下去那一瞬间) ...

  3. Confluence 6 为搜索引擎隐藏外部链接

    为搜索引擎隐藏外部链接能够避免向你的站点添加垃圾信息.如果你启用了这个选项的话,任何插入到页面中的 URLs 和评论将会赋予 'nofollow' 属性,这个属性将会禁止搜索引擎进行索引.  快捷链接 ...

  4. Confluence 6 配置校验和识别

    校验你的设置 查看你 Confluence 当前使用的设置,请参考 Viewing System Properties 页面中的内容. 识别系统属性 请参考 Recognized System Pro ...

  5. jquery 获取和设置 select下拉框的值

    获取Select : 获取select 选中的 text : $("#ddlRegType").find("option:selected").text(); ...

  6. cf919D 线性dp+拓扑排序

    /* 给定一张有向图,图上每个结点都有一个字符,现在要求出一条路径,要使路径上某字符出现的次数最多 如果有环,输出-1即可 拓扑排序+dp dp[i][26]表示排序到结点i时26个字符出现的次数 在 ...

  7. hdu1198 普通的并查集

    今天开始(第三轮)并查集,,之前学的忘了一些 本题很简单直接上代码 #include<iostream> #include<cstring> #include<cstdi ...

  8. Nginx详解十:Nginx场景实践篇之Nginx静态资源场景配置

    一.静态资源WEB服务 1.静态资源类型:非服务器动态运行生成的文件 2.静态资源服务场景-CDN 假设静态资源存储中心在云南,用户在北京去请求一个文件,那么就会造成一个传输的延时,而如果Nginx同 ...

  9. 第三周学习总结-Java

    2018年7月29日 这是暑假第三周.这一周我把找到的Java教学视频看完了. 本周学到了Java剩余的基础知识,比如:抽象类.接口.内部类.几种常用类.IO流.多态.多线程等等. 因为没有书,所以我 ...

  10. 用HBuilderX 打包 vue 项目 为 App 的步骤

    首先打包你的 vue 项目 生成 dist 文件夹,教程请移步  https://www.cnblogs.com/taohuaya/p/10256670.html 看完上面的教程,请确保 你是 将: ...