基于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文档. 源码在 ...
随机推荐
- Android下利用zxing类库实现扫一扫
程序源代码及可执行文件下载地址:http://files.cnblogs.com/rainboy2010/zxingdemo.zip zxing,一款无比强大的条码解析类库,下面讲解一下如何利用zxi ...
- nginx负载均衡后端tomcat无法加载js资源
JS或css无法完全加载 nginx的代理缓存区,默认较小导致部分文件出现加载不全的问题,比较典型的如jQuery框架,可以通过配置调整nginx的缓存区即可.主要参考proxy参数 最终完整配置如下 ...
- mtu简单说明
总结:本地的mtu值==网络设备的mtu值是最优的,一般本地和网络设备的默认值都是1500(字节),没什么特殊需求,尽量不要修改 一.什么是 MTU 值 1 从字面上来说,MTU 是英文 Maxi ...
- 大数据python词频统计之本地分发-file
统计某几个词在文章出现的次数 -file参数分发,是从客户端分发到各个执行mapreduce端的机器上 1.找一篇文章The_Man_of_Property.txt如下: He was proud o ...
- HTML之Position用法
在此,先做声明,本篇仅是摘录自互联网,个人认为这篇文章讲的很不错,附于此地与大家共同欣赏. position的四个属性值: 1.relative2.absolute3.fixed4.static下面分 ...
- Centos7 linux 卸载自带安装的jdk 并yum自动安装jdk1.8
一:卸载系统自带安装的JDK 注:本文参考了< 使用CentOS7卸载自带jdk安装自己的JDK1.8> 通过xshell工具成功连接安装好的虚拟机之后可通过 rpm -qa | g ...
- 断路器Ribbon
断路器:就是对服务访问不到的情况做出自己的错误,也就是故障转移(将当前出现故障的请求重新返回特定消息) 改造消费者项目(RibbonDemo) 1.在pom.xml中引入hystrix的jar包 &l ...
- 单例、异常、eval函数
一.单例 01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他 ...
- HTML&javaSkcript&CSS&jQuery&ajax(五)
一.Framset标签定义了每个框架中的HTML文档, 1. <framset cols="25%,75%"> <frame src="frame_a. ...
- vue 的动画
1.vue 的动画流程分为enter,和leave分别对应以下两幅图 <!doctype html><html lang="en"><head> ...