基于C语言的Socket网络编程搭建简易的Web服务器(socket实现的内部原理)
首先编写我们服务器上需要的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实现的内部原理)的更多相关文章
- GitHub的实现是否是基于此语言的支持网络编程性呢?
我觉好像是的,我之前很奇怪为什么那样就可以引用了,后来发现GitHub中的java JavaScript phton等语言都支持网络编程.
- 基于python2【重要】怎么自行搭建简单的web服务器
基本流程:1.需要的支持 1)python本身有SimpleHTTPServer 2)ForkStaticServer.py支持,该文件放在python7目录下 3)将希望共享 ...
- Socket网络编程--FTP客户端(60篇socket博客,而且都比较简单、深入浅出)
已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...
- Go语言练习:网络编程实例——简易图片上传网站
1.代码结构 2.运行实例 1.代码结构 $ tree . ├── photoweb.go ├── public │ ├── css │ ├── images │ └── js ├── u ...
- 5.3linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- Python面向对象进阶和socket网络编程-day08
写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...
- 用go-module作为包管理器搭建go的web服务器
本篇博客主要介绍了如何从零开始,使用Go Module作为依赖管理,基于Gin来一步一步搭建Go的Web服务器.并使用Endless来使服务器平滑重启,使用Swagger来自动生成Api文档. 源码在 ...
随机推荐
- sysstat-----获取服务器负载历史记录
sysstat工具与负载历史回放 很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来 ...
- 基础常用的数据结构 Collection Map
map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map ...
- Confluence 6 数据库表-系统信息(System information)
这些表格有存储数据相关的状态和 Confluence 站点的相关配置信息. confversion 被用来在升级系统的时候确定那个数据库的版本应该使用,这个表格只对数据库升级有影响. pluginda ...
- python之内置模块random(转载)
转载自http://www.cnblogs.com/wcwnina/p/9281334.html random.seed(a=None, version=2) # 初始化伪随机数生成器,若种子a相同, ...
- ob_start用法详解
用PHP的ob_start(); 一. 相关函数简介:1.Flush:刷新缓冲区的内容,输出.函数格式:flush()说明:这个函数经常使用,效率很高.2.ob_start :打开输出缓冲区函数格式: ...
- sqlmap实例文档
sqlmap 手册参数整理文档 1.--data sqlmap -u "http://www.target.com/vuln.php" --data="id=1" ...
- cf1131f 构造+并查集
#include<bits/stdc++.h> using namespace std; #define maxn 150005 int f[maxn],n; vector<int& ...
- vue @click 使用三目运算(实现动态更换绑定的函数)
转载:https://www.jianshu.com/p/ea4471c9f333 @click 错误写法 @click="dialogStatus=='create'?createData ...
- java实现满天星swing&awt
一起有两个类 1.MyStar.java package day02; import java.awt.Color; import javax.swing.JFrame;import javax.sw ...
- azkaban安装使用
本文记录azkaban的安装和 一些报错处理(文章末尾). AzKaban组成 MySQL数据库,azkaban-server (web端),azkaban-executor (执行job) 1.下载 ...