首先编写我们服务器上需要的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. Python- 索引 B+数 比如书的目录

    1.索引 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题, 在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作, 因此对查询 ...

  2. 1)django-建立步骤和目录说明

    一:前言 django是python最流行的WEB框架. 二:django安装 pip install django 三:django项目建立步骤 1.创建django工程 django-admin ...

  3. python-时间模块,random、os、sys、shutil、json和pickle模块

    一.time与datetime模块 time模块: 时间戳:表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,返回类型为float类型 格式化时间字符串(Format String) ...

  4. hadoop常用命令详细解释

    hadoop命令分为2级,在linux命令行中输入hadoop,会提示输入规则 Usage: hadoop [--config confdir] COMMAND where COMMAND is on ...

  5. iOS -- Effective Objective-C 阅读笔记 (2)

    1: 多用类型常量, 少用 #define 预处理指令 #define 预处理指令会把碰到的所有 指定名称 一律换位 定义的内容, 这样的话, 假设此指令在某个头文件中, 那么所有引入这个头文件的代码 ...

  6. java+appium 自动化环境搭建

    1.安装JDK1.7及以上 2.下载解压sdk并且配置环境变量: ANDROID_HOME:...\adt-bundle-windows-x86_64-20140702\sdk PATH:%ANDRO ...

  7. 一种基于NTC的控温电路及软件实现

    NTC(Negative Temperature Coefficient)是一种随温度上升时,电阻值呈指数关系减小的热敏电阻.应用广泛,最近我们就采用了NTC来控制加热并测温,并达到了预期的效果. 1 ...

  8. 基于ARM Cortex-M和Eclipse的SWO单总线输出

    最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章,文章结构明晰,讲解透彻,本人深受启发,特意将其翻 ...

  9. SoapUI、Jmeter、Postman三种接口测试工具的比较分析

    前段时间忙于接口测试,也看了几款接口测试工具,简单从几个角度做了个比较,拿出来与诸位分享一下吧.各位如果要转载,请一定注明来源,最好在评论中告知博主一声,感谢.本报告从多个方面对接口测试的三款常用工具 ...

  10. nikto for windows(web扫描工具) 使用教程

    本文出处: 欧普软件 ----------------------------------------------------------------------------------------- ...