首先编写我们服务器上需要的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)

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <netdb.h>
  9. #include <arpa/inet.h>
  10. #include <unistd.h>
  11.  
  12. int KEY_QUIT = ;
  13. char referrer[]={};
  14. int content_length=;
  15. #define SERVER_PORT 80
  16. static char copybuf[]={};
  17. #define DEBUG 1
  18.  
  19. int copy(FILE *read_f, FILE * write_f) //复制文本的API函数copy
  20. {
  21. int n;
  22. int wrote;
  23. n = fread(copybuf,,sizeof(copybuf),read_f);
  24. wrote = fwrite(copybuf,n,,write_f);
  25. return ;
  26. }
  27.  
  28. int DoHTML(FILE *f, char * name)
  29. {
  30. FILE *infile;
  31. infile = fopen(name,"r"); //打开本地Client端请求的html文件,文件名为name
  32.  
  33. printf("Sending mesg...\n");
  34. copy(infile,f); //复制Client客户端请求的html文件
  35. printf("Complete sending.\n");
  36. fread(copybuf,,sizeof(copybuf),f);
  37. fclose(infile);
  38. return ;
  39. }
  40.  
  41. int ParseReq(FILE *f, char *r) //分析处理请求文件流当中的内容提取请求的文件名index.html
  42. {
  43. char *bp;
  44. char *c;
  45. #ifdef DEBUG
  46. printf("req is %s", r); //请求的内容例如: GET /index.html HTTP/1.1
  47. #endif
  48. while(*(++r) != ' '); //去掉请求内容开头所有的空格部分
  49. while(isspace(*r)) r++; //判断输入字符是否为空格/回车/制表符等,去掉所有的这些字符
  50. while(*r == '/') r++; //去掉所有的'/'字符
  51. bp = r; //得到文件名的起始指针
  52. while(*r && (*r != ' ') && (*r != '?')) r++;
  53. *r = ;
  54. c = bp;
  55. printf("The Request FileName is %s\n", c);
  56. DoHTML(f, c); //得到文件名之后处理请求的操作
  57. return ;
  58. }
  59.  
  60. int HandleConnect(int fd)
  61. {
  62. FILE *f;
  63. char buf[];
  64. f = fdopen(fd, "a+"); //打开对应文件名的html文件
  65. setbuf(f, ); //清楚f文件缓存区
  66. fgets(buf, , f); //从Client端请求中获取前面150个字符
  67. #ifdef DEBUG
  68. printf("buf is %s", buf);
  69. #endif
  70. ParseReq(f, buf); //分析请求的内容
  71. fflush(f); //清空文件缓冲区,将其内容写入文件
  72. fclose(f);
  73. return ;
  74. }
  75.  
  76. void * key(void *data)
  77. {
  78. int c;
  79. for(;;)
  80. {
  81. c = getchar();
  82. if(c == 'q'||c == 'Q')
  83. {
  84. KEY_QUIT = ;
  85. exit();
  86. break;
  87. }
  88. }
  89. }
  90.  
  91. int main(int argc, char *argv[])
  92. {
  93. int fd,sockfd;
  94. int len;
  95. volatile int true = ;
  96. struct sockaddr_in ec;
  97. struct sockaddr_in server_sockaddr;
  98. pthread_t th_key;
  99. printf("Starting httpd...\n");
  100. printf("press q to quit..\n");
  101.  
  102. sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  103. setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,(void*)&true,sizeof(true));
  104. server_sockaddr.sin_family = AF_INET;
  105. server_sockaddr.sin_port = htons(SERVER_PORT);
  106. server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  107. bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr));
  108. listen(sockfd,*);
  109.  
  110. pthread_create(&th_key,NULL,key,);
  111.  
  112. printf("Wait for connection....\n");
  113. while()
  114. {
  115. len = sizeof(ec);
  116. if((fd=accept(sockfd,(void *)&ec,&len)) == -)
  117. {
  118. exit();
  119. close(sockfd);
  120. }
  121. printf("Handle Connection...\n");
  122. HandleConnect(fd);
  123. }
  124. }

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

  1. server:WebServer.c
  2. gcc -o server WebServer.c -lpthread
  3. clean:
  4. rm server

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

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Welcome to nginx!</title>
  5. <style>
  6. body {
  7. width: 35em;
  8. margin: 0 auto;
  9. font-family: Tahoma, Verdana, Arial, sans-serif;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <h1>Welcome to nginx!This is my first Web Project!Author MM1994UESTC</h1>
  15. <p>If you see this page, the nginx web server is successfully installed and
  16. working. Further configuration is required.</p>
  17.  
  18. <p>For online documentation and support please refer to
  19. <a href="http://nginx.org/">nginx.org</a>.<br/>
  20. Commercial support is available at
  21. <a href="http://nginx.com/">nginx.com</a>.</p>
  22.  
  23. <p><em>Thank you for using nginx.</em></p>
  24. </body>
  25. </html>

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

  1. 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. sysstat-----获取服务器负载历史记录

    sysstat工具与负载历史回放 很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来 ...

  2. 基础常用的数据结构 Collection Map

    map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map ...

  3. Confluence 6 数据库表-系统信息(System information)

    这些表格有存储数据相关的状态和 Confluence 站点的相关配置信息. confversion 被用来在升级系统的时候确定那个数据库的版本应该使用,这个表格只对数据库升级有影响. pluginda ...

  4. python之内置模块random(转载)

    转载自http://www.cnblogs.com/wcwnina/p/9281334.html random.seed(a=None, version=2) # 初始化伪随机数生成器,若种子a相同, ...

  5. ob_start用法详解

    用PHP的ob_start(); 一. 相关函数简介:1.Flush:刷新缓冲区的内容,输出.函数格式:flush()说明:这个函数经常使用,效率很高.2.ob_start :打开输出缓冲区函数格式: ...

  6. sqlmap实例文档

    sqlmap 手册参数整理文档 1.--data sqlmap -u "http://www.target.com/vuln.php" --data="id=1" ...

  7. cf1131f 构造+并查集

    #include<bits/stdc++.h> using namespace std; #define maxn 150005 int f[maxn],n; vector<int& ...

  8. vue @click 使用三目运算(实现动态更换绑定的函数)

    转载:https://www.jianshu.com/p/ea4471c9f333 @click 错误写法 @click="dialogStatus=='create'?createData ...

  9. java实现满天星swing&awt

    一起有两个类 1.MyStar.java package day02; import java.awt.Color; import javax.swing.JFrame;import javax.sw ...

  10. azkaban安装使用

    本文记录azkaban的安装和 一些报错处理(文章末尾). AzKaban组成 MySQL数据库,azkaban-server (web端),azkaban-executor (执行job) 1.下载 ...