Simple Web Server

  web服务器hello world!-----简单的socket通信实现。

HTTP

  HTTP是Web浏览器与Web服务器之间通信的标准协议,HTTP指明了客户端如何与服务器建立连接,如果从服务器请求数据,服务器如何响应请求,关闭连接。HTTP是使用TCP/IP协议进行传输数据的,也就是传输层利用TCP进行连接,进行可靠连接的。

详情:点击

请求

一般格式,如:

  GET /index.html HTTP/1.0
Accept:text/html,text/plain
User-Agent: Lyn
Host:www.server.com

我们主要需要的信息在第一行,共包括三个字段。

  • 第一个字段(GET)为请求动作类型:

    • GET代表请求的操作,表示要求服务器返回资源的表示;
    • HEAD表示只需要文件的首部;
    • PUT表示向服务器上传资源;
    • POST主要是向服务器发送表单数据.
  • 第二个字段(/index.html),标识服务器上所请求的资源的相对URL,必须要以"/"开头,Web浏览器在发送请求的时候会自动加上服务器的主机名。
  • 第三个字段(HTTP/1.0),客户端理解的协议版本

注意: 

  每一个HTTP请求都要以两个回车换行结束(\r\n\r\n)
GET发送查询字符串主要直接将查询字符串附加到URL后面,如下表示:GET /index.html/user=XXX&Age HTTP/1.0

响应

 一般格式,如

HTTP/1.1 200 OK
Date:Mon 15
Server:xxxxxx
Content-Type:text/html;
Content-length:xxx 代表文档的多少个字节,不包含首部字节数

<html><head><title>Hello</title></head><body>Test</body></html>

  我们需要大概构造这样的一个格式来回复浏览器。

  所以,必须包含第一行的状态行、内容的格式、内容的长度和具体的内容。

实例

/*
 * A Simple Web Server
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <error.h>

#define PORT 9000

#define EOL "\r\n"
#define EOL_SIZE 2

int recv_new(int fd, char *buffer);
void send_new(int fd, char *msg);

int main(int argc, char* argv[])
{
    int serv_fd;
    int client_fd;

    int ret;

    pid_t pid;
    struct sockaddr_in serv_addr;
    struct sockaddr_in client_addr;
    int    len = sizeof(struct sockaddr_in);

    serv_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(serv_fd < 0){
        perror("create socket fail !\n");
        exit(1);
    }

    bzero(&serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(PORT);

    int on = 1;
    ret = setsockopt(serv_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int));
    if(ret < 0){
        perror("setsockopt fail !\n");
        exit(1);
    }

    ret = bind(serv_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    if(ret < 0){
        perror("bind fail !\n");
        exit(1);
    }

    ret = listen(serv_fd, 5);
    if(ret < 0){
        perror("listen fail !\n");
        exit(1);
    }

    while(1){
        client_fd = accept(serv_fd, (struct sockaddr*)&client_addr, &len);
        if(client_fd < 0){
            perror("accept fail !\n");
            continue;
        }
        char buffer[200];
        recv_new(client_fd, buffer);
        printf("recv buffer: %s\n", buffer);
        char content[] = "<head><head><title>index.html</title></head><body>hello world!</body>";
        char response[512];
        sprintf(response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s", strlen(content), content);
        send(client_fd, response, sizeof(response), 0);
        close(client_fd);
    }

    return 0;
}

int recv_new(int fd, char *buffer) {
    char *p = buffer; // Use of a pointer to the buffer rather than dealing with the buffer directly
    int eol_matched = 0; // Use to check whether the recieved byte is matched with the buffer byte or not
    while (recv(fd, p, 1, 0) != 0) // Start receiving 1 byte at a time
    {
        if (*p == EOL[eol_matched]) // if the byte matches with the first eol byte that is '\r'
        {
            ++eol_matched;
            if (eol_matched == EOL_SIZE) // if both the bytes matches with the EOL
            {
                *(p + 1 - EOL_SIZE) = '\0'; // End the string
                return (strlen(buffer)); // Return the bytes recieved
            }
        } else {
            eol_matched = 0;
        }
        p++; // Increment the pointer to receive next byte
    }
    return (0);
}

参考

http://computerdragon.blog.51cto.com/6235984/1191176

http://www.cnblogs.com/lynch_world/archive/2011/04/24/2026413.html

http://css.dzone.com/articles/web-server-c


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2025-01-21 00:13:11

Simple Web Server的相关文章

What&amp;#39;s New in the Web Server (IIS) Role (IIS 7)

What's New in the Web Server (IIS) Role (IIS 7) What are the major changes? Many features have been added or enhanced in Internet Information Services (IIS) 7.5, which is the foundation of the Web Server role in Windows Server 2008 R2. The following

Beginning Winsock Programming - Simple TCP server

Introduction The WinSock (Windows Sockets) API is a socket programming library for Microsoft Windows Operating Systems. It was originally based on Berkeley sockets. But several Microsoft specific changes were employed. In this article I shall attempt

在Java ME平台中使用Subversion、NetBeans IDE和Sun Java System Web Server

问题 源代码管理(SCM)产品用于管理多个版本的项目文件,允许您保存新版本.恢复较旧版本以及在不同版本之间进行比较.当您在修改项目的过程中引入了bug,这将是一个非常有价值的功能.大多数较新源代码管理(SCM)产品除了可管理各文件的版本之外,还提供了在 Bell 实验室中开发的源代码控制系统(SCCS). 即使对于小型项目,每一位开发人员也应该使用源代码管理(SCM).小型项目转变成大型项目是必然的事情,虽然从工作上说仅仅需要修复错误和添加功能.跟踪和管理软件的能力是获得成功的关键因素. 应用程

Delphi开发Web Server程序返回图像的方法

Internet/Intranet在九十年代可能是最流行的计算机术语了,不管是计算机行业内的人士还是计算机外的人士,都会使用Internet/Intranet,有的查资料,有的是宣传自己和公司,甚至有许多以前从没有想到用Internet的东西现在也在用Internet来解决, 比如有的程控数字计算机维护用Internet来解决.在这一切应用之中,基于Web Server的应用程序的开发是基本点,但如何开发Web Server的程序呢? Delphi 3是Borland公司1997年推出的可视化.

安全配置和维护Apache WEB Server

apache|server|web|安全 前言:在目前的Internet时代,主页已成为树立公司形象和展示自我天地的一个重要手段,配置一台强大且安全的Web Server就显得尤其重要.在众多的Web Server产品中,Apache是应用最为广泛的一个产品, 同时也是一个设计上非常安全的程序.但是,同其它应用程序一样,Apache也存在安全缺陷.本文将详细介绍如何正确配置和维护Apache WEB Server的安全性问题等. 一.Apache服务器的介绍 Apache服务器它是Interne

通过asp入侵web server,窃取文件毁坏系统-ASP漏洞集

server|web    本文主要叙及有关ASP/iis的安全性问题及其相应对策,不提倡网友使用本文提及的方法进行任何破坏,否则带来的后果自负通过asp入侵Web server,窃取文件毁坏系统,  这决非耸人听闻...   iis的安全性问题   1.iis3/pws的漏洞   我实验过,win95+pws上运行ASP程序,只须在浏览器地 址栏内多加一个小数点ASP程序就会被下载下来.IIS3听说也有同样的问题,不过我没有试出来.   2.iis4的漏洞   iis4一个广为人知的漏洞是::

通过asp入侵web server,窃取文件毁坏

本文主要叙及有关asp/iis的安全性问题及其相应对策,不提倡网友使用本文提及的方法进行任何破坏,否则带来的后果自负 通过asp入侵web server,窃取文件毁坏系统,这决非耸人听闻... iis的安全性问题 1.iis3/pws的漏洞 我实验过,win95+pws上运行ASP程序,只须在浏览器地址栏内多加一个小数点ASP程序就会被下载下来.IIS3听说也有同样的问题,不过我没有试出来. 2.iis4的漏洞 iis4一个广为人知的漏洞是::$DATA,就是ASP的url后多加这几个字符后,代

通过asp入侵web server,窃取文件毁坏系统

本文主要叙及有关asp/iis的安全性问题及其相应对策,不提倡网友使用本文提及的方法进行任何破坏,否则带来的后果自负 通过asp入侵web server,窃取文件毁坏系统,这决非耸人听闻... iis的安全性问题 1.iis3/pws的漏洞我实验过,win95+pws上运行ASP程序,只须在浏览器地址栏内多加一个小数点ASP程序就会被下载下来.IIS3听说也有同样的问题,不过我没有试出来. 2.iis4的漏洞iis4一个广为人知的漏洞是::$DATA,就是ASP的url后多加这几个字符后,代码也

以前收集的一些资料---怎么解决InterDev错误“Unable to contact Web server”

interdev|server|web|错误|解决 你这个问题产生的原因实在太多了,我只好给你一一列出来了:1.首先要保证你的Web Server运行中,检查方法是使用IE随便打开你Web上的一个页面  注意是打开Web Server上的页面,不要使用打开文件方式.2.保证你安装了FrontPage Server Extensions.检查方法如下:  打开以下网址,如果出现下面的错误,就说明你还没有安装.   http://<servername>/_vti_bin/shtml.dll.