文档章节

Http服务器-第二步支持单纯的文件请求

梦想游戏人
 梦想游戏人
发布于 2016/09/09 00:58
字数 593
阅读 31
收藏 1

实现完整的网页浏览支持

 


#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <vector>
#include <thread>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
/*
#include <functional>
#include "direct.h"
#include <map>
#include <memory>
#include <queue>
#include <condition_variable>
#include <mutex>
#include <atomic>

#include <unordered_map>
*/

#include "winsock.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#pragma comment (lib,"wsock32")


using namespace  std;



typedef struct
{
	int size;
	unsigned char *buffer;
}FileData;



typedef struct
{
	int client;
	int size;
	unsigned char *buffer;
}SendBuffer;



class FileReader
{
public:
	~FileReader()
	{
		if (this->data.buffer)
			delete this->data.buffer;
	}
	FileReader(string &fileName)
	{
		this->name = fileName;
		memset((void*)&this->data, 0, sizeof(FileData));

	}

	bool ReadFile()
	{

		FILE *file = fopen(this->name.c_str(), "rb");
		if (!file)
		{
			cout << " error open file : " << name << endl;

			return false;
		}
		cout << name << endl;
		fseek(file, 0, SEEK_END);
		int size = ftell(file);
		fseek(file, 0, SEEK_SET);

		unsigned char *buf = new  unsigned char[size];


		fread(buf, size, 1, file);

		this->data.size = size;
		this->data.buffer = buf;

		fclose(file);

		return true;
	}

	string name;
	string rb;
	FILE* file;
	FileData data;
};



void SendThread(void*arg1, void*arg2)
{
	SendBuffer *buf = (SendBuffer*)arg1;

	SendBuffer *buf1 = (SendBuffer*)arg2;


	send(buf->client, (const char*)buf->buffer, buf->size, 0);
	send(buf1->client, (const char*)buf1->buffer, buf1->size, 0);


	closesocket(buf->client);
	delete buf1->buffer;
	delete buf1;
	delete buf;

}




int main()
{
	WSADATA wsadata;
	WORD wVersion = MAKEWORD(2, 0);
	WSAStartup(wVersion, &wsadata);



	int sock, length;
	length = sizeof(sockaddr);


	struct sockaddr_in server_ipaddr, client_ipaddr;
	memset(&server_ipaddr, 0, length);
	server_ipaddr.sin_family = AF_INET;
	server_ipaddr.sin_port = htons(80);
	server_ipaddr.sin_addr.s_addr = inet_addr("127.0.0.1");


	char buff[4096]; int nbuff;

	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	::bind(sock, (sockaddr *)&server_ipaddr, length);


	listen(sock, 180);



	char *head =
		"HTTP/1.0 200 OK\n"
		"Content-Type: text/html\n\n";

	char *head_js =
		"HTTP/1.0 200 OK\n"
		"Content-Type: application/x-javascript\n\n";




	char *head_css =
		"HTTP/1.0 200 OK\n"
		"Content-Type: 	text/css\n\n";


	char *head_png =
		"HTTP/1.0 200 OK\n"
		"Content-Type: 	image/png\n\n";



	char *head_jpg =
		"HTTP/1.0 200 OK\n"
		"Content-Type: 	image/jpeg\n\n";


	char *head_exe =
		"HTTP/1.0 200 OK\n"
		"Content-Type: 	application/x-msdownload\n\n";





	char *html1 =
		"<html><head><title>我的第一个 HTML 页面</title></head><body>";

	char * p = "<p>body 元素的内容会显示在浏览器中。</p>";

	char *html2 = "<p>title 元素的内容会显示在浏览器的标题栏中。</p>"
		"</body></html>";


	std::cout << "start server ok" << std::endl;
	int sock_client, len;
	while (1)
	{

		sock_client = accept(sock, (sockaddr *)&client_ipaddr, &length);
		if (sock_client == SOCKET_ERROR)
		{

			WSACleanup();
			goto RETURN;

		}
		len = recv(sock_client, buff, 4095, 0);
		buff[len] = '\0';
		std::string s = buff;
		if (!s.size())
		{
			continue;
		}

		s = s.substr(0, s.find("\n"));

		int i = s.find(" ", 0);


		std::string type = s.substr(0, i++);
		std::string req = s.substr(i, s.find(" ", i) - i);
		cout << req << endl;

		req = req.substr(1, -1);
		req = req.substr(0, req.find('?'));

		fstream file;
		file.open(req, ios::in);


		s = req;

		char *h = head;


		if (s.find(".css") != string::npos)
		{
			h = head_css;
		}
		if (s.find(".js") != string::npos)
		{
			h = head_js;
		}if (s.find(".html") != string::npos)
		{
			h = head;
		}
		if (s.find(".png") != string::npos)
		{
			h = head_png;
		}

		if (s.find(".jpg") != string::npos)
		{
			h = head_jpg;
		}
		if (s.find(".exe") != string::npos)
		{
			h = head_exe;
		}




		FileReader* reader = new FileReader(req);
		reader->ReadFile();



		SendBuffer *sb = new SendBuffer;
		sb->size = strlen(h);
		sb->buffer = (unsigned char*)h;
		sb->client = sock_client;
		SendBuffer *sb2 = new SendBuffer;
		sb2->size = reader->data.size;
		sb2->buffer = (unsigned char*)reader->data.buffer;
		sb2->client = sock_client;



		std::thread t(SendThread, sb, sb2);
		t.detach();

		cout << endl;

	}

RETURN:

	system("pause");

	return 0;
}

运行结果

 

© 著作权归作者所有

梦想游戏人
粉丝 41
博文 461
码字总数 132517
作品 0
成都
私信 提问
零基础微信开发入门指南

在微信开发之前需要了解一下内容: 微信公众号的编辑者模式和开发者模式的区别? 编辑者模式只是单纯图文编辑,类似在word下的操作。开发者模式是微信团队开放给第三方服务器接入微信服务器与...

Allen
2016/05/04
215
0
Nginx 反向代理 负载均衡 虚拟主机配置

通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常用配置的说明。即学即用,你还在等什么?...

Java架构
2018/07/11
0
0
nginx简单入门

nginx设计最初是为了解决c10k问题作为反向代理服务器,可以反向代理http和smtp/pop3请求,但是很快就被一群没有get到重点的公司带上了web服务器的不归路,比如某宝就开发了tengine,使用Nginx...

Ailu0li
2017/01/17
0
0
前端筑基篇(一)->ajax跨域原理以及解决方案

说明 本文内容较老,而且已经不再更新,最新更新请移步 http://www.jianshu.com/p/82b82d5dd1ea 跨域主要是由于浏览器的“同源策略”引起,分为多种类型,本文主要探讨Ajax请求跨域问题 前言 ...

撒网要见鱼
2016/09/21
0
0
Linux平台下DHCP服务的工作原理和配置规范

DHCP协议工作原理: 第一步:客户端请求IP地址——发送DHCPDISCOVER广播包在网络上寻找DHCP服务器 第二步:服务器响应请求——发送DHCPOFFER广播包,包含IP地址、MAC地址、域名以及地址租期 ...

tynecastle
2014/09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
23分钟前
20
3
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部