编写简单web服务器

 1 #ifndef _MYSOCKET_H_
 2 #define _MYSOCKET_H_
 3 #include <string>
 4 #include <WinSock2.h>
 5
 6 class MySocker
 7 {
 8 public:
 9     enum TypeSocket
10     {
11         BlockingSocket,
12         UnBlockingSocket
13     };
14     MySocker();
15     MySocker(SOCKET new_socket);
16     virtual ~MySocker();
17     std::string ReceiveLine();
18     bool SendLine(std::string buffer);
19     bool operator==(unsigned long code)
20     {
21         return socket_ == code;
22     }
23     void Close();
24
25 protected:
26     SOCKET socket_;
27 private:
28     static bool init_winsocket;//防止socket被重复初始化
29 };
30
31 class SocketClient :public MySocker
32 {
33 public:
34     SocketClient(const std::string &host, int port);
35 };
36
37 class SocketServer :public MySocker
38 {
39 public:
40     SocketServer(int port, int connections, TypeSocket type = BlockingSocket);//1、端口 2、接收的连接数 3、
41     MySocker* Accept();
42 };
43
44 #endif // _MYSOCKET_H_
  1 #include "stdafx.h"
  2 #include "MySocker.h"
  3
  4 bool MySocker::init_winsocket = false;
  5 MySocker::MySocker()
  6 {
  7     if (!init_winsocket)
  8     {
  9         //保证单一性
 10         WSADATA info;
 11         if (WSAStartup(MAKEWORD(2, 2), &info))
 12             throw "can not start WSA";
 13         init_winsocket = true;
 14     }
 15
 16     socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 17     if (INVALID_SOCKET == socket_)
 18     {
 19         throw "Invalied sock";
 20     }
 21 }
 22
 23
 24 MySocker::MySocker(SOCKET new_socket)
 25 {
 26     socket_ = new_socket;
 27 }
 28
 29 MySocker::~MySocker()
 30 {
 31 }
 32
 33 std::string MySocker::ReceiveLine()
 34 {
 35     std::string ret;
 36     while (true)
 37     {
 38         char buf;
 39         switch (recv(socket_, &buf, 1, 0))
 40         {
 41         case 0:
 42             return ret;
 43             break;
 44         case -1:
 45             return "";
 46             break;
 47         default:
 48             break;
 49         }
 50         ret += buf;
 51         if (buf == ‘\n‘)
 52         {
 53             break;
 54         }
 55     }
 56     return ret;
 57 }
 58
 59 bool MySocker::SendLine(std::string buffer)
 60 {
 61     buffer += ‘\n‘;
 62     return SOCKET_ERROR != send(socket_, buffer.c_str(), buffer.length(), 0);
 63 }
 64
 65 void MySocker::Close()
 66 {
 67     closesocket(socket_);
 68 }
 69
 70 SocketClient::SocketClient(const std::string &host, int port)
 71 {
 72     bool isok = false;
 73     do
 74     {
 75         HOSTENT *he = gethostbyname(host.c_str());
 76         if (!he)
 77         {
 78             break;
 79         }
 80         sockaddr_in addr = { 0 };
 81         addr.sin_family = AF_INET;
 82         addr.sin_port = htons(port);
 83         addr.sin_addr = *((in_addr*)he->h_addr);
 84
 85         if (SOCKET_ERROR == connect(socket_, (sockaddr*)&addr, sizeof(sockaddr)))
 86         {
 87             break;
 88         }
 89         isok = true;
 90     } while (false);
 91     if (!isok)
 92     {
 93         char error_msg[MAXBYTE] = { 0 };
 94         DWORD erroc_coe = WSAGetLastError();
 95         strerror_s(error_msg, WSAGetLastError());
 96         throw error_msg;
 97     }
 98 }
 99
100 SocketServer::SocketServer(int port, int connections, TypeSocket type /*= BlockingSocket*/)
101 {
102     sockaddr_in addr = { 0 };
103     addr.sin_family = PF_INET;
104     addr.sin_port = htons(port);
105     if (type == UnBlockingSocket)
106     {
107         //设置非阻塞
108         unsigned long arg = 1;
109         ioctlsocket(socket_, FIONBIO, &arg);
110     }
111
112     if (SOCKET_ERROR == bind(socket_, (sockaddr*)&addr, sizeof(sockaddr)))
113     {
114         Close();
115         throw "Bind Error";
116     }
117
118     listen(socket_, connections);
119 }
120
121 MySocker* SocketServer::Accept()
122 {
123     MySocker *accept_socket = new MySocker(accept(socket_, nullptr, nullptr));
124     if (*accept_socket == INVALID_SOCKET)
125     {
126         throw "Invalid socket";
127     }
128     return accept_socket;
129 }
 1 // WebServerDemo.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <process.h>
 7 #include <fstream>
 8 #include "MySocker.h"
 9
10 #pragma  comment(lib,"ws2_32.lib")
11
12 unsigned int __stdcall Connection(void *p)
13 {
14     MySocker *accept_socket = (MySocker*)p;
15
16     std::ifstream file("1.txt");
17     std::string buf;
18     while (getline(file, buf))
19     {
20         accept_socket->SendLine(buf);
21     }
22
23     accept_socket->SendLine("<html><body><h1>Hello Word</h1><p>Hello Word</p></body></html>");
24     while (true)
25     {
26         //每次发送一个数据去浏览器,其实浏览器也有数据返回给服务器
27         std::string buffer = accept_socket->ReceiveLine();
28         if (buffer.empty())
29         {
30             break;
31         }
32         std::cout << buffer;
33     }
34     delete accept_socket;
35     return 0;
36 }
37
38 int _tmain(int argc, _TCHAR* argv[])
39 {
40     /*try
41     {
42     SocketClient web_read("www.baidu.com", 80);
43     web_read.SendLine("GET / HTTP/1.0");
44     web_read.SendLine("Host:www.baidu.com");
45     web_read.SendLine("");
46     while (true)
47     {
48     std::string buf = web_read.ReceiveLine();
49     if (buf.empty())
50     {
51     break;
52     }
53     std::cout << buf;
54     }
55     }
56     catch (const char *error_msg)
57     {
58     std::cout << error_msg << std::endl;
59     }*/
60
61     try
62     {
63         SocketServer web_server(80, 10);
64         while (true)
65         {
66             MySocker *accept_socket = web_server.Accept();
67             CloseHandle((HANDLE)_beginthreadex(nullptr, 0, Connection, accept_socket, 0, nullptr));
68             //accept_socket->SendLine("<html><body><h1>Hello Word</h1><p>Hello Word</p></body></html>");
69         }
70     }
71     catch (const char * e)
72     {
73         std::cout << e << std::endl;
74     }
75     catch (...)
76     {
77         std::cout << "Unknow Error" << std::endl;
78     }
79
80     return 0;
81 }
时间: 2024-10-16 17:14:25

编写简单web服务器的相关文章

Socket网络编程--简单Web服务器(1)

这一次的Socket系列准备讲Web服务器.就是编写一个简单的Web服务器,具体怎么做呢?我也不是很清楚流程,所以我找来了一个开源的小的Web服务器--tinyhttpd.这个服务器才500多行的代码,使用C语言.这一小节就不讲别的内容了.就对这个程序进行一些注释和讲解了. 主函数: 1 int main(void) 2 { 3 int server_sock = -1; 4 u_short port = 0; 5 int client_sock = -1; 6 struct sockaddr_

Socket实现简单Web服务器

上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 1)熟悉Socket编程: 2)熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重点在浏览器端.本篇博客则反过来讲一下怎样使用socket来实现Web服务器,怎样去接收.分析.处理最后回复来自浏览器的HTTP请求. HTTP协议是浏览器和Web服务器都需要遵守的一种通信规范,如果我们编写一个程序,正确遵守了HTTP协议,那么理论上讲,这个程序可以具备浏览器.甚至Web服务

java实现简单web服务器(分析+源代码)

在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.为了简化操作,这里不考虑资源不存在等异常情况.web服务基于的是HTTP协议,用户在浏览器的地址栏输入要访问的地址,服务器如何得到该地址是个关键.先看下一般的HTTP请求和响应报文的一般格式: HTTP 请求报文 HTTP 响应报文 web服务器获取一个用户的连接时,会初始化一个线程和用户通信,代码如下:

【Web后端笔记】基于Socket实现的简单Web服务器搭建

我们在地址栏中输入的内容称为通用资源标记符(Universal Resource Identifier,URI)它有很多种样式,在Web中我们通常称为统一资源定位符(Uniform Resource Locator,URL)的形式,它的格式如下: 协议://主机[.端口号][绝对路径[?参数]] 在http://www.cnblogs.com/DebugLZQ/中,http表示协议名称;www.cnblogs.com表示主机的地址:可选的端口号没有出现,那么,将使用http协议默认的端口号80:

Python 实现简单 Web 服务器

Python 实现简单 Web 服务器 最近有个需求,就是要创建一个简到要多简单就有多简单的web服务器,目的就是需要一个后台进程用来接收请求然后处理并返回结果,因此就想到了使用python来实现. 首先创建一个myapp.py文件,其中定义了一个方法,所有的请求都会经过此方法,可以在此方法里处理传递的url和参数,并返回结果. def myapp(environ, start_response): status = '200 OK' headers = [('Content-type', 't

tomcat解析之简单web服务器(图)

链接地址:http://gogole.iteye.com/blog/587163 之前有javaeyer推荐了一本书<how tomcat works>,今天晚上看了看,确实不错,第一眼就着迷了. 于是乎就学着书上的例子敲了敲,学会了一个简单web服务器的大概实现,当然,这个简直就无法称之为web服务器,但是也算是走进web服务器的第一步吧. 这篇文章仅限于学习记录,文笔凌乱之处,还望各位见谅. OK,下面进入正题: 开始之前,首先我们要清楚以下几个内容. 首先,一个最简单服务器包括三个部分:

自己实现简单Web服务器,支持GET POST请求

最近项目上遇到一个需求,最后想到的解决方案是自己实现一个web服务器去处理请求,然后再将信息发送到另外一个程序.然后返回处理之后的结果呈现出来. 现在我就来分享一下如何实现的. 通过.NET 为我们提供的HttpListener类实现对Http协议的处理,实现简单的web服务器. 注意:此类在 .NET Framework 2.0 版中是新增的.所以支持.NET Framework 2.0以上版本.该类仅在运行 Windows XP SP2 或 Windows Server 2003 操作系统的

Socket网络编程--简单Web服务器(6)

本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息,例如一个配置类的一个属性为PAGE404的字符串,该字符串保存一个文件地址,然后我们的Page_404函数就可以用access判断PAGE404这个字符串对应的文件是否存在,如果存在那么如果是404页面那么就cat这个文件,而不是默认的404函数里面的页面.还有个端口什么的都是通过一个类似宏定义一

一个基于AIO实现的简单web服务器

一下是一个基于AIO实现的简单web服务器,这是一个简单例子 /** * 一个简单的web 服务器<br/> * 通过浏览器输入localhost:8080/访问 * * @author Joeson * @since 2014/05 * */ public class AioServer implements Runnable { private AsynchronousChannelGroup asyncChannelGroup; private AsynchronousServerSoc