zoukankan      html  css  js  c++  java
  • 最简单的http服务器实现

    现在有很多功能强大的http服务器,APACHE,IIS我们应该都很熟悉

    其实众多的http服务器都有个最基本的工作流程:

    1.初始化工作环境,在固定端口(80)侦听外部请求

    2.接收请求

    3.建立连接

    4.发送响应头部

    5.发送响应内容

    6.中断连接

    下面是个最简单的http服务器的例子,用winsock实现

    为什么是最简单的呢,因为它接收到请求后,发送的响应头部和响应内容都是直接指定的

    不能区别不同的get,post,head 请求。

    #include "winsock.h"
    #include "stdlib.h"
    #include "stdio.h"
    #include "string.h"
    #pragma comment (lib,"wsock32")///所需的库文件

    void main()
    {
     /////////////初始化winsock环境
     WSADATA wsadata;
     WORD wVersion=MAKEWORD(2,0);/////////winsock 2.0
     if(WSAStartup(wVersion,&wsadata)!=0)
     {
      printf("initalize failed!\n");
      WSACleanup();
      exit(1);
     }


     
     int sock,csock,length;//sock是服务器端侦听套接字,csock是客户端连接套接字
     length=sizeof(struct 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("211.81.55.200");


     char buff[4096];int nbuff;

     sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    ///绑定
     if(bind(sock,(struct sockaddr *)&server_ipaddr,length)==SOCKET_ERROR)
     {
      printf("Bind error\n");
      WSACleanup();
      exit(1);
     }
    ////侦听
     if(listen(sock,5)==SOCKET_ERROR)
     {
      printf("Listen error\n");
      WSACleanup();
      exit(1);
     }

     /////////////
     char headers[1000];//////////保存头部
     /////////头部格式
     char hdrFmt[]=
      "HTTP/1.0 200 OK\r\n"
      "Server: MySocket Server\r\n"
      "Date: %s\r\n"
      "Content-Type: text/html\r\n"
      "Accept-Ranges: bytes\r\n"
      "Content-Length: %d\r\n\r\n";
     char * strGmtNow="08/15/14 22:53:00 GMT";///////////随便指定了一个时间
     wsprintf(headers, hdrFmt, (const char*) strGmtNow, strlen(CustomHtml));
     //////////要传送的网页内容
     char CustomHtml[]=
      "<html>\r\n"
      "<head>\r\n"
      "<title></title>\r\n"
      "</head>\r\n"
      "<body>\r\n"
      "<p align=\"center\">欢迎访问我的主页</p>\r\n"
      "<h3 align=\"center\"><a href=\"Default.htm\">快乐天地</a></h3>\r\n"
      "<p>结束</p>\r\n"
      "<p> </p>\r\n"
      "</body></html>\r\n\r\n";
     

     //////////
     while(1)
     {
      //////////侦听到连接后,产生新的套接字
      ///////////用来和客户端传递消息
      csock=accept(sock,(struct sockaddr *)&client_ipaddr,&length);
      if(csock==SOCKET_ERROR)
      {
       printf("Listen error\n");
       WSACleanup();
       exit(1);
      }
      nbuff=recv(csock,buff,4095,0);
       buff[nbuff]='\0';
      printf("%s",buff);
     /////发送响应头部
      send(csock,headers,strlen(headers),0);
     /////发送内容 
      send(csock,CustomHtml,strlen(CustomHtml),0);
     /////////关闭本次连接
      closesocket(csock);


     }

    }

  • 相关阅读:
    代理支持
    CGI
    SSI(服务器端嵌入)
    SSL/TLS 配置
    JSPs
    类加载机制
    JDBC 数据源
    安全管理
    Realm 配置
    Js将序列化成Json格式后日期(毫秒数)转成日期格式
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1661445.html
Copyright © 2011-2022 走看看