使用C++制作简单的web服务器(续)

增加功能:

1、从文件中读取网页并返回给客户端,而不是把网页代码写死在代码中。

局限:

1、还不能根据URL地址中的参数,访问指定页面

2、仍然是单线程

//*****************************************************************************

//@ProjectName     ZYhttpd
//@Description      my http server
//@Author          NicoleRobin
//@Date          2015/02/09

//*****************************************************************************

#include <cstdio>
#include <string>
#include <fstream>
#include <WinSock2.h>

using namespace std;

#define BUFFER_SIZE 1024
#define HOST "127.0.0.1"
#define PORT 81
#define HEADER "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\nServer: ZYhttp_v1.0.1\r\nContent-Length: %ld\r\n\r\n"
const string strPath = "index.html";
#pragma comment(lib, "WS2_32")

// get file size

long GetFileLength(string strPath);

// thread function

int main(int argc, char **argv)

{

    // define and init an server sockaddr

    sockaddr_in addrServer;

    addrServer.sin_family = AF_INET;

    addrServer.sin_addr.S_un.S_addr = INADDR_ANY;

    addrServer.sin_port = htons(PORT);

    // init socket dll

    WSADATA wsaData;

    WORD socketVersion = MAKEWORD(2, 0);

    if (WSAStartup(socketVersion, &wsaData) != 0)

    {

        printf("Init socket dll error!");

        exit(1);

    }

    // create socket

    SOCKET socketServer = socket(AF_INET, SOCK_STREAM, 0);

    if (SOCKET_ERROR == socketServer)

    {

        printf("Create socket error!");

        exit(1);

    }

    // bind server socket host

    if (SOCKET_ERROR == bind(socketServer, (LPSOCKADDR)&addrServer, sizeof(addrServer)))

    {

        printf("Bind server host failed!");

        exit(1);

    }

    // listen

    if (SOCKET_ERROR == listen(socketServer, 10))

    {

        printf("Listen failed!");

        exit(1);

    }

    while (true)

    {

        printf("Listening ... \n");

        sockaddr_in addrClient;

        int nClientAddrLen = sizeof(addrClient);

        SOCKET socketClient = accept(socketServer, (sockaddr*)&addrClient, &nClientAddrLen);

        if (SOCKET_ERROR == socketClient)

        {

            printf("Accept failed!");

            break;

        }

        char buffer[BUFFER_SIZE];

        memset(buffer, 0, BUFFER_SIZE);

        if (recv(socketClient, buffer, BUFFER_SIZE, 0) < 0)

        {

            printf("Recvive data failed!");

            break;

        }

        printf("Recv data : \n%s", buffer);

        /*

        // response

        memset(buffer, 0, BUFFER_SIZE);

        ifstream fin(strPath.c_str(), ios::in | ios::binary);

        if (fin.is_open())

        {

            char szTmp[512] = "";

            fin.read(szTmp, 511);

            sprintf_s(buffer, HEADER, GetFileLength(strPath), szTmp);

            if (send(socketClient, buffer, strlen(buffer), 0) < 0)

            {

                printf("Send data failed!");

                break;

            }

        }

        fin.close();

        */

        // response 

        // send header

        memset(buffer, 0, BUFFER_SIZE);

        sprintf_s(buffer, HEADER, GetFileLength(strPath));

        if (send(socketClient, buffer, strlen(buffer), 0) < 0)

        {

            printf("Send data failed!");

            break;

        }

        ifstream fin(strPath.c_str(), ios::in | ios::binary);

        if (fin.is_open())

        {

            memset(buffer, 0, BUFFER_SIZE);

            while (fin.read(buffer, BUFFER_SIZE - 1))

            {

                if (send(socketClient, buffer, strlen(buffer), 0) < 0)

                {

                    printf("Send data failed!");

                    break;

                }

                memset(buffer, 0, BUFFER_SIZE);

            }

            if (send(socketClient, buffer, strlen(buffer), 0) < 0)

            {

                printf("Send data failed!");

                break;

            }

        }

        fin.close();

        closesocket(socketClient);

    }

    closesocket(socketServer);

    WSACleanup();

    return 0;

}

long GetFileLength(string strPath)

{

    ifstream fin(strPath.c_str(), ios::in | ios::binary);

    fin.seekg(0, ios_base::end);

    streampos pos = fin.tellg();

    long lSize = static_cast<long>(pos);

    fin.close();

    return lSize;

    /*

    long lSize = 0;

    ifstream fin(strPath.c_str(), ios::in | ios::binary);

    char szBuf[1024*1000] = "";

    while (fin.read(szBuf, 1024 * 1000 - 1))

    {

        lSize += strlen(szBuf);

        memset(szBuf, 0, 1024*1000);

    }

    fin.close();

    lSize += strlen(szBuf);

    return lSize;

    */

}

演示图

以上所述就是本文对于使用C++实现简单web服务器的全部代码了,希望大家能够喜欢。

时间: 2024-10-11 06:14:36

使用C++制作简单的web服务器(续)的相关文章

《Python入门》第一个Python Web程序——简单的Web服务器

上一篇讲了<Python入门>Windows 7下Python Web开发环境搭建笔记,接下来讲一下Python语言Web服务的具体实现:第一个Python Web程序--简单的Web服务器. 与其它Web后端语言不同,Python语言需要自己编写Web服务器. 如果你使用一些现有的框架的话,可以省略这一步: 如果你使用Python CGI编程的话,也可以省略这一步: 用Python建立最简单的web服务器 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下. 一.请求-处理-响应模型 1.1 基本过程介绍 每一个HTTP请求都会经历三个步凑:请求-处理-响应:每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面

代码片段 - Golang 实现简单的 Web 服务器

------------------------------ 下面一段代码,实现了最简单的 Web 服务器: 编译环境: Linux Mint 18 Cinnamon 64-bit Golang 1.7 ------------------------------ // main.go package main import ( "fmt" "log" "net/http" ) // 处理主页请求 func index(w http.Respon

《Go语言入门》第一个Go语言Web程序——简单的Web服务器

概述 上一篇讲了 <Go语言入门>第一个Go语言程序--HelloWorld,接下来讲一下Go语言Web开发入门必修课:第一个Go语言Web程序--简单的Web服务器. 与其它Web后端语言不同,Go语言需要自己编写Web服务器. 有关本地环境的搭建与基础学习,请参考: <Go语言入门>如何在Windows下安装Go语言编程环境 Go语言Web应用:IBM的云平台Bluemix使用初体验--创建Go语言 Web 应用程序,添加并使用语言翻译服务 Web服务器代码 Google在ht

python第三方库系列之十六--建立最简单的web服务器

利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认8000] 例如: python -m SimpleHTTPServer 8080 然后就可以在浏览器中输入 http://localhost:端口号/路径 来访问服务器资源. 例如: http://localhost:8080/index.htm(当然index.htm文件得自己创建) 其他机器也可以通过服务器的IP地址来访问. 这里的

python搭建简单的web服务器

由于要做自动化和性能测试,工作中需要有一个能够控制返回消息数据的web服务器,所以用python初步实现了一个简单的web服务器,能够处理HTTP的请求(GET,POST,PUT),并完成响应.先简单说明下原理,python中实现web服务器大概分两个步骤: 1.      创建一个套接字,绑定到指定的IP和端口,保持监听 2.      创建一个handle类,当收到请求消息时,作出响应 主要使用的类有两个: HTTPServer:HTTP服务器的基类,提供了HTTP服务器的常用方法,创建服务

使用 Nodejs 搭建一个简单的Web服务器

使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 作为一个Web服务器应具备以下几个功能: 1.能显示以.html/.htm结尾的Web页面 2.能直接打开以.js/.css/.json/.text结尾的文件内容 3.显示图片资源 4.自动下载以.apk/.

Nodejs 入门秘籍,搭一个最简单的web服务器。(菜鸟的你也能秒懂)

心血来潮,总结了一个Nodejs入门秘籍.看了你就想学NodeJs了. 一.简单介绍nodejs 初学nodejs  ,直接上简单实例.先简单说明一下:nodejs ,nodejs相当于服务器端的 可以轻易搭建一个服务器端. nodejs是用C++开发的一种运行于服务器端的语言,可以写网站后台程序,可以做服务端应用开发,语法和JAVASCRIPT一样,会JS,就是会NodeJS,区别于,普通JS是脚本运行客户端,而NODEJS中的JS是运行于服务器端,NODEJS的作用相当PHP,ASP等语言.

实验五(简单嵌入式WEB服务器实验)问题总结

实验五问题总结 问题链接:<信息安全系统设计基础>实验五实验报告 虽然将07_httpd文件中全部拷贝进了bc中,文件夹中拥有Makefile文件,但是还是无法通过make得到该文件夹中copy和httpd的可执行文件.解决:第一次是觉得Makefile文件中的PATH路径不对,将其改成了/home/bc/07_httpd存盘退出后发现还是无法执行,第二次我们直接使用gcc对其单步进行编译:armv4l-unknow-linux-gcc –E copy.c –o copy.iarmv4l-un