http服务器_http服务器框架 - CSDN
精华内容
参与话题
  • 简单HTTP服务器实现

    千次阅读 2018-10-30 20:46:03
    我们这里实现一个简单的HTTP服务器,无论浏览器向我们请求什么数据,我们都返回一个hello world   //实现最简单的http服务端程序 //返回hello world //http是应用协议,在传输层使用的是tcp协议所以我们的程序...

       我们这里实现一个简单的HTTP服务器,无论浏览器向我们请求什么数据,我们都返回一个hello world

      

    //实现最简单的http服务端程序
    //返回hello world
    //http是应用协议,在传输层使用的是tcp协议所以我们的程序本质上是tcp服务器
    //我们http指定监听10000端口,所以在请求访问的时候也要手动指定否则默认80端口
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<string.h>
    #include<errno.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    
    int main(int argc,char* argv[])
    {
        int sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(sockfd<0)
        {
            perror("socket error\n");
            return -1;
        }
        struct sockaddr_in lst_addr;
        lst_addr.sin_family=AF_INET;
        lst_addr.sin_port=htons(9998);
        lst_addr.sin_addr.s_addr=inet_addr("192.168.76.130");
        socklen_t len=sizeof(struct sockaddr_in);
        int ret=bind(sockfd,(struct sockaddr*)&lst_addr,len);
        if(ret<0)
        {
            perror("bind error\n");
            return -1;
        }
        if(listen(sockfd,5)<0)
        {
            perror("listen error\n");
            return -1;
        }
        while(1)
        {
            struct sockaddr_in cli_addr;
            int newfd=accept(sockfd,(struct sockaddr*)&cli_addr,&len);
            if(newfd<0)
            {
                perror("accept error\n");
                continue;
            }
            char buff[1024]={0};
            int ret=recv(newfd,buff,1023,0);
            if(ret>0)
            {
                printf("req:%s\n",buff);
    			//这里我们打印的是浏览器HTTP的请求头部
            }
            //返回的http头部信息要包括
            //首行 HTTP/1.1 200 OK
            //头信息:
            // 空行
            // 正文
            char *rsp="<h1>hello world</h1>";
            memset(buff,0x00,1024);
            sprintf(buff,"%s\r\n%s%d\r\n%s\r\n\r\n%s%","HTTP/1.1 200 OK","Content-Length: ",strlen(rsp),"Content-Type:text/html:charset=UTF-8",rsp);
    		//这里我们返回的是简单的字符串hello world
    		//%s \r\n 第一行输出了HTTP/1.1 200 OK
    		//%S %d \r\n 这里第二行输出了Content-Length: strlen(rsp) 这里我们是想通过这个关键字告诉浏览器我们这次发送的数据是多少
    		//%s \r\n 这一行输出了Content-Type:text/html:charset=UTF-8 是告诉浏览器我们的文件格式和编码格式
    		//\r\n 这一行是HTTP头部头部和正文之间的空行
    		//%s 这里才是我们最终传输的数据
    		//这一部分的内容才真正算是我们的HTTP协议的部分,这里是我们用HTTP协议和浏览器交流的部分。
    		printf("%s", buff);
            send(newfd,buff,strlen(buff),0);
            close(newfd);
        }
    }
    

     

    当我们运行程序之后,在浏览器输入网络地址:网络号就可以来访问我们的服务器。第一次很有可能会失败,因为我们的Linux有防火墙,这里我们必须要关闭一下Linux自身的防火墙。

    运用 sudo service iptables stop来关闭我们系统的防火墙。

    然后运行我们的程序,之后在浏览器输入192.168.76.130:9998

    这是浏览器给我们的请求头信息

    这里我们也打印了我们给浏览器的头信息和数据

    这时候我们看我们的浏览器

    能够正常返回我们的hello world代表服务器没有问题。

    展开全文
  • 基于HTTP实现的小型web服务器

    千次阅读 2018-09-12 22:26:09
    主要流程为:服务器获得请求–&gt;响应并处理请求–&gt;返回结果。 完整的HTTP过渡到TCP实现客户端与服务器的交互过程 1.当客户端执行网络请求的时候,从url中解析出url的主机名,并将主机地址转换成ip 2....

    主要流程为:服务器获得请求–>响应并处理请求–>返回结果。

    完整的HTTP过渡到TCP实现客户端与服务器的交互过程
    1.当客户端执行网络请求的时候,从url中解析出url的主机名,并将主机地址转换成ip
    2.从url解析出服务器的所用端口号
    3.客户端用TCP连接服务器
    4.连接成功后 获取输出流,将数据以报文的形式传递给服务器
    5.当服务器接收到数据之后,进行判断和解析码,并回应一条响应报文
    6.客户端从输入流中获取报文,然后进行解析
    7.关闭网络连接

    HTTP的特点


    1、支持客户端/服务器的模式
    2、简单快捷 客户向服务器发送请求服务时,只需要传送请求方法和路径,每种方法规定了客户与服务器联系的类型的不同,由于HTTP协议简单,使得HTTP服务器的规模小,因此通信速度很快.
    3、灵活  允许传送各种类型的数据,数据类型用Content-Type标记
    4、无连接:限制每次连接只处理一个请求,服务器处理完客户的请求,收到客户的应答后,随即断开连接,这种方式节省传输时间,请求应答机制会断开
    5、无状态  HTTP协议是无状态的协议,即对事务处理没有记忆功能

    关于URL


    即统一资源定位符,每个网页都对应一个URL地址(俗称网址),具有全球唯一性。它包含的信息指出文件的位置以及浏览器应该怎么处理它。 一个完整的URL包括协议类型、主机类型、路径和文件名。 
    http协议的URL格式: http: //host[:port][abs_path] ,http表示使用http协议来进行资源定位;host是主机域名;port是端口号,一般有默认的;abs_path代表资源的路径。 
    这里我主要介绍项目中涉及的URL的两种格式—URL带参数和不带参数的。

    HTTP的请求与响应格式


    响应报头中的状态码和状态码描述,例如:当请求的资源不存在时,会收到“404 NotFound”的页面,404就是状态码,“NotFound”就是状态码描述,即请求的文件不存在。

    1.实现支持GET和POST方法的小型http服务器
    GET方法:如果GET方法只是简单的请求一份资源,而不传递参数的话则由服务器直接将资源返回即可。如果GET方法的url中带有参数的话,则就要使用CGI模式进行处理。 
    POST方法:POST方法要使用CGI模式进行处理,POST的参数在消息中文中出现。
    使用GET方法使用的是带参数的url,传递的参数会使用?连接在资源后面POST方法使用的是不带参数的url 它的参数是通过http请求正文传递给服务器的,http的请求和响应模式


    响应报头中的状态码和状态码描述,举个例子,当请求的资源不存在的时,会收到"404 NotFound"的页面,404就是状态码,

    "NotFound"就是状态码描述,既请求的文件不存在

    状态码表示响应类型

    1×× 保留

    2×× 表示请求成功地接收

    3×× 为完成请求客户需进一步细化请求

    4×× 客户错误

    5×× 服务器错误 

    响应头的信息包括:服务程序名,通知客户请求的URL需要认证,请求的资源何时能使用

     

    HTTP服务器实现框架


    1.面向链接:http协议是基于TCP通信协议,因此实现web服务器的第一步至少要能实现两个主机不同进程之间的TCP通信,并且需要解决高并发问题所以这里推荐使用多线程服务器来构建,每次创建出来一个新线程出来的时候将线程分离,然后让这个新线程去处理这个请求.
    2.分析出请求行: 当服务器接收到请求后,首先知道的是HTTP服务器版本号,和请求方法。web服务器是要支持cgi模式: 请求的方法不同,cgi可能也不同,我们实现的知识比较简单单的处理GET和POST方法
    3.判断cgi模式
    //    1)当我们判断出来是GET请求时候,并且url中没有参数的话,就用非CGI模式,非CGI模式处理//起来比较简单,首先解析出来请求路径,判断是不是合法资源,如果是就直接返回这个资源。
    //    2)当是CGI模式处理请求的时候,我们要fork一个子进程,对子进程exec替换CGI程序,这个
    //过程中使用pipe进行父子进程之间的通信。所有需要的参数在exec之前,都将这些参数导出为环境变//量,就算exec的话,子进程还是能够通过环境变量获取所需的参数。
    4.响应客户端:此时我们已经知道了方法以及是否为cgi模式,然后开始读取URL,这里有一个细节非cgi模式 请求参数会跟在url当中,如果cgi模式的话,参数在消息正文中,然后我们读取到路径,判断路径当中资源是否存在,如果存在判断这个资源是一个目录,普通文件还是一个可执行程序

    这里分情况分析
        1)如果是cgi模式,直接进入cgi内部运行;只要是POST方法就需要支持cgi,直接进入cgi函数内部运行.
        2)如果是非cgi模式时一定是GET方法并且没有参数,此时进入wwwroot()函数内部即可,该函数会将所请求的资源以html的格式返回给浏览器.

     

    接下来是解释运行cgi模式,首先服务器要从浏览器读取参数,然后创建出来一个子进程去执行cgi部分的可执行资源,父进程通过环境变量的方式传递给子进程,子进程运行完成之后呢,将结果交给父进程,父进程再将数据输出给浏览器. 所以父进程在这个例子当中就向是一个中介,只进行参数和结果的转交实际上并不会执行任何资源,因此将子进程的输入输出文件描述符重定向,就可以让子进程直接与浏览器"联系".



    父进程做的事情

    1. 1.创建两个管道,并关闭相应的文件描述符 
    2. 2.POST方法:继续读取数据,直到读完POST的参数部分GET方法:直接从子进程读取结果
    3. 3.将数据和方法全部交给子进程后等待子进程的结果

    子进程做的事情

    1. 1.关闭管道适当的文件描述符
    2. 2.对标准输入输出进行重定向
    3. 3.通过环境变量传递参数
    4. 4.进行exec程序替换

     

    一次完整的http请求的流程

    项目文件

    目录: 
    python:爬取小说和招聘信息的代码

    sql_connect:存放mysql需要的lib库   连接mysql程序文件
    wwwroot:web服务器工作的根目录,包含各种资源页面(例如默认的index.html页面,差错处理的404页面),以及执行cgi的可执行程序

    文件: 

    makefile:编译整个项目
    httpd.h:服务器的方法声明 
    httpd.c:方法实现 
    main.c:服务器的主逻辑

     

    数据库中的操作
    没有索引的时候会进行整个表的扫描
    添加索引 索引会形成一颗二叉树  利用二分查找的方法。

    遇到的问题:
    1.运行cgi后不能显示在页面上,便尝试着写一个简单的CGI程序看自己的CGI是否真的能跑完,结果CGI没有问题,后来尝试用telnet工具模拟一次http,看看是否真的收到了网页回复,后来分析结果,对比之后发现返回的东西不能显示,之后给html加了一些p标签,便可以显示出来。
    2. 经常会出现类似于:undefined reference to `sql_connecter::~sql_connecter()'的问题,文件编译的路径不对。
    3.调用数据库的数据显示到html文件中出现乱码的问题,最初以为自己编码格式有问题,后来发现是数据库编码格式和浏览器的编码格式不一样,数据库使用utf8编码方式,浏览器是GB2312,后来浏览器使用utf8编码格式,能够正常显示。

    4.代码中会需要int *和 void*的转换,用到C++强制转换形如  int*  data = reinterpret_cast<int*>(arg);

    5.本地环回测试ok,Linux下的浏览器测试也可以,但不能接外部的浏览器访问(没有设置桥接模式) 在外部浏览器测试的话千万别忘记关闭防火墙 

    6.运行程序时会提醒挺行下载页面,因为在响应报头有问题中。而浏览器对于不能识别或解析的实体,都会提醒用户下载。

    展开全文
  • 什么是http服务器

    万次阅读 多人点赞 2019-02-25 10:13:43
    本篇文章旨在从服务器后台开发的角度剖析一个简单的http服务器的运行原理. 我们知道浏览器是http(s)的客户端,目的是连接远程的http服务器,然后服务器返回浏览器数据.浏览器接收数据解析数据之后展现出来.我们看到的...

    本篇文章旨在从服务器后台开发的角度剖析一个简单的http服务器的运行原理.

    我们知道浏览器是http(s)的客户端,目的是连接远程的http服务器,然后服务器返回浏览器数据.浏览器接收数据解析数据之后展现出来.我们看到的外在表现就是,浏览器访问一个url,然后就得到相应的web页面.

    同样我们知道,浏览器与http服务器是通过http协议,传输层是tcp协议,因为他是有连接,可靠的协议.关于http协议简单的介绍一下:


    一个标准的HTTP请求由以下几个部分组成

    <request-line>
    <headers>
    <CRLF>
    [<request-body><CRLF>]

    在HTTP请求中,第一行是请求行(request-line),用来说明请求类型、要访问的资源(URL)以及使用的HTTP版本;
    紧接着是多行头部(headers)信息,用来说明服务器要使用的附加信息;
    头部信息之后是一个回车换行符(\r\n),用于标明头部信息的结束。
    以上是必须内容,根据需要可在头部信息结束之后增加主体数据(request-body);

    主体数据之后是一个回车换行符(\r\n),用于标明主体数据的结束。

    例如,我们可以在IE浏览器上输入下面的网址:

    http://localhost:8000/hello/index.html

    HTTP请求的头部信息如下:

    GET /hello/index.html HTTP/1.1
    Accept: */*
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    Host: localhost:8000
    Connection: Keep-Alive
    Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6

    收到请求数据之后,服务器解析,毕竟是明文字符,这个简单.然后服务器就知道了客户端的要求--获取目录hello/index.html文件.服务器读取文件内容发送给浏览器就好了.

    后来随着业务逻辑越来越复杂,单单获取某个html文件功能早已不能满足需求,个性化需求呼之欲出.比如在线问卷调查表,他究竟是怎么把我们填写的数据传递给服务器的呢?

    你可能会说那不是一样,客户端发送什么内容,服务器就接收什么内容.可是你想过没有,每个网站的需求是不一样的,本来服务器接收到浏览器的请求数据已经是够复杂的了,还让服务器来解析数据并响应不同的数据处理,这不太现实.

    一般的,服务器最好只接收数据,如果让服务器也处理数据逻辑,势必会让服务器变得很复杂,稳定性也得不到保证.

    另外一个角度是为了让程序复用,提高生产效率.也就是说,如果不关注业务逻辑,只注重接收数据,那么服务器程序可以给任何一个开发者使用.换句话说,我们不用从头开始写.直接使用现有的高性能的服务器就可以满足需求了.例如公司白领中午要吃饭,不可能跑回家自己去做饭吃,自己叫外卖就好了.

    但是现实问题仍然没有解决,通过什么方式去处理业务逻辑呢?

    你要给手机充电时,把插头插入插线板就能获取电了.插线板有接口,提供了电.

    同理服务器程序最好也提供接口,浏览器通过统一的接口给服务器,然后我们从服务器接口中获取我们想要的数据.获取数据之后我们可以把数据交给第三方程序来处理逻辑,这样就做到与服务器业务分离了,good iead.

    事实上,现在的http服务器就是这么做的,不过很复杂而已.下一篇开始为您介绍这些接口.

    附录:HTTP Request Header 请求头

     

    Header 解释 示例
    Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html
    Accept-Charset 浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5
    Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding: compress, gzip
    Accept-Language 浏览器可接受的语言 Accept-Language: en,zh
    Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
    Authorization HTTP授权的授权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control: no-cache
    Connection 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) Connection: close
    Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new;
    Content-Length 请求的内容长度 Content-Length: 348
    Content-Type 请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded
    Date 请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
    Expect 请求的特定的服务器行为 Expect: 100-continue
    From 发出请求的用户的Email From: user@email.com
    Host 指定请求的服务器的域名和端口号 Host: www.zcmhi.com
    If-Match 只有请求内容与实体相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”
    If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
    If-None-Match 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
    If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range: “737060cd8c284d8af7ad3082f209582d”
    If-Unmodified-Since 只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
    Max-Forwards 限制信息通过代理和网关传送的时间 Max-Forwards: 10
    Pragma 用来包含实现特定的指令 Pragma: no-cache
    Proxy-Authorization 连接到代理的授权证书 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    Range 只请求实体的一部分,指定范围 Range: bytes=500-999
    Referer 先前网页的地址,当前请求网页紧随其后,即来路 Referer: http://www.zcmhi.com/archives/71.html
    TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE: trailers,deflate;q=0.5
    Upgrade 向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
    User-Agent User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Linux; X11)
    Via 通知中间网关或代理服务器地址,通信协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
    Warning 关于消息实体的警告信息 Warn: 199 Miscellaneous warning


    --------------------- 
    作者:Shonm 
    来源:CSDN 
    原文:https://blog.csdn.net/zxm342698145/article/details/79995039 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • http服务-搭建简易的http服务器

    万次阅读 2018-09-30 10:41:56
    http服务-搭建简易的http服务器仅仅实现了Post和Get,也就简单的使用了 200 OK,100-continue和发送http格式的文本而已,其实我们只要按照HTTP协议收发数据即可。先来一张做http上传功能时的意外收获,也是待会我们的...

    ##http服务-搭建简易的http服务器
    仅仅实现了Post和Get,也就简单的使用了 200 OK,100-continue和发送http格式的文本而已,其实我们只要按照HTTP协议收发数据即可。

    • 先来一张做http上传功能时的意外收获,也是待会的测试图片
      七夕
    • 浏览器访问我们所建立的链接
      其实就是要返回一段http协议要求的内容即可,当然首先我们要建立一个监听
    //建立监听,比较简单,看文末尾贴出的代码即可
    if(xml_parse.find("GET")!=string::npos)
    {
    	//向客户端发送200 ok及相应的文本信息
    	sprintf( buf, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s",strlen("Hello World!"),"Hello World!");
    	send(clientsoc, buf, strlen(buf)+1, 0);
    	printf("已回复 200 OK\n");
    	continue;
    }
    //如果提交的内容过大,提交可能会发送要求100-continue,将数据分开发送。
    if(xml_parse.find("100-continue")!=string::npos)
    {
    	sprintf( buf, "HTTP/1.1 100-continue\r\n");
    	send(clientsoc, buf, strlen(buf)+1, 0);
    	printf("已回复100-continue!\n");
    	//这个是不太管用的,连续两次
    	image_contimue=false;
    }
    		
    
    • 这是用浏览器直接与http服务器建立连接后返回的文本信息。http://127.0.0.1:9000
      浏览器访问

    • 提交表单,先写一份提交表单的简单html文件
      上传文件时,一定要注意 enctype=“multipart/form-data”,否则只是上传的文件路径

    <html>
    	<head>
    	</head>
    	<body>
    		<!-上传文件时,一定要注意  enctype="multipart/form-data",否则只是上传的文件路径>
    		<form action="http://127.0.0.1:9000" method="post" enctype="multipart/form-data">
    			<input type="file" name="update"/>
    			<input type="submit" value="上传"/>
    		</form>
    		<form action="http://127.0.0.1:9000" method="post">
    		    <input type="text" name="myText"/>
    		    <input type="submit" />
    		</form>
    	</body>
    </html>
    
    • 左侧使我们的http服务器,右侧是我们刚写的html文件

      上传图片

    • 提交文本信息
      提交文本

    • 提交图片信息

    • 上传文字

      http服务器收到的图片
      图片结果

    • 附上http服务器源码

     #include "stdafx.h"
     #include <winsock2.h>
     #pragma comment(lib,"ws2_32.lib")
     #include <fstream>
     #include <iostream>
     #include <string>
     using namespace std;
     int _tmain(int argc, _TCHAR* argv[])
     {
    	SOCKET serversoc;   
    	SOCKET clientsoc;
    	SOCKADDR_IN serveraddr;
    	SOCKADDR_IN clientaddr;
    	char buf[1024];
    	int len;
        WSADATA wsa;
    	WSAStartup(MAKEWORD(2,0),&wsa);	//初始化WS2_32.DLL
    	//创建套接字
    	if((serversoc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)  
    	{
    		printf("套接字socket创建失败!\n");
    	}
    	
    	//命名协议,IP,端口
    	serveraddr.sin_family = AF_INET;
    	serveraddr.sin_port = htons(9000);
    	serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    	//绑定套接字
    	if(bind(serversoc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0)
    	{
    		printf("套接字绑定失败!\n");
    	}
    	
        start:
    	printf("开始监听...\n");
    	//监听请求
    	if(listen(serversoc, 1) != 0)
    	{
    		printf("监听失败!\n");
    	}
    
    	len = sizeof(SOCKADDR_IN);
    	
    	//接收请求
    	if((clientsoc = accept(serversoc, (SOCKADDR *)&clientaddr, &len))<=0)
    	{
    		printf("接受连接失败!\n");
    	}
    	printf("**************连接成功*********\n");
    
    	Sleep(100);
    	//接收数据
    
    	bool image=false;
    	bool image_contimue=false;
    	bool text=false;
    	while(1)
    	{
    		memset(buf,0,1024);
    		int x=0;
    		x=recv(clientsoc, buf, 1024, 0);
    		if(x<= 0)	
    		{
    			printf("关闭连接!\n");
    			closesocket(clientsoc);
    			goto start;
    		}
    		cout<<buf<<endl;
    		string xml_parse(buf);
    
    		if(xml_parse.find("GET")!=string::npos)
    		{
    			sprintf( buf, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s",strlen("Hello World!"),"Hello World!");
    			send(clientsoc, buf, strlen(buf)+1, 0);
    			printf("已回复 200 OK\n");
    			continue;
    		}
    		//if(xml_parse.find("POST")!=string::npos)
    		{
    			if(xml_parse.find("100-continue")!=string::npos)
    			{
    				sprintf( buf, "HTTP/1.1 100-continue\r\n");
    				send(clientsoc, buf, strlen(buf)+1, 0);
    				printf("已回复100-continue!\n");
    				//这个是不太管用的,连续两次
    				image_contimue=false;
    			}else
    			{
    				int off_set=0;
    				if(off_set=xml_parse.find("Content-Type: image"))
    				{
    					if(off_set>0&&image_contimue==false)
    					{
    						image=true;
    						image_contimue=true;
    						off_set=xml_parse.find_last_of("Content-Type: image");
    						if(off_set<=0)
    							continue;
    						string tmp=xml_parse.substr(off_set+5);
    
    						cout<<tmp<<endl;
    						ofstream fout;
    						fout.open("received.jpeg",ios::binary|ios::app);
    						fout.write(buf+off_set+5,x-off_set-5);
    						fout.close();
    					}else if(image==true)
    					{
    						if(image_contimue==true)
    						{
    							ofstream fout;
    							fout.open("received.jpeg",ios::binary|ios::app);
    							fout.write(buf,x);
    							fout.close();
    						}
    
    					 }
    
    				}
    			}
    		}
    	}
    	printf("关闭连接!\n");
    	closesocket(clientsoc);
    	goto start;
    	WSACleanup();     //释放WS2_32.DLL
    	return 0;
    }
    
    
    展开全文
  • WEB/HTTP服务器搭建

    万次阅读 2019-01-20 10:03:33
    HTTP 对于软件都有服务和客户,有服务端和客户端 服务 就是在操作系统运行一个或者多个程序,并为客户端提供相应所需的服务 协议 就是计算机网络中进行数据交换而建立的规则、标准或约定的集合。只有遵守这个...
  • HTTP服务器(一)

    千次阅读 2019-02-01 22:10:58
    基本疑问知识点荟萃
  • Http服务器

    2019-03-01 22:54:59
    Http服务器 Http服务器 1.技术 Java(基本语法、Socket接口) 多线程技术 Http协议 2.环境 JDK1.8 IDEA管理工具 Maven管理工具 3.功能 支持静态资源处理 支持动态程序处理 4.特点 采用...
  • http服务器实现(一)

    千次阅读 2017-12-29 15:49:05
    深入学习http服务器,这是本文的目的,而不是实现一个真正可用的http服务器。毕竟实现一个成熟可用http服务器的难度很大。软件都经历过很多版本的迭代,在不断测试、bug调试和完善功能的过程中,最终才变得成熟可用...
  • 简易HTTP服务器

    千次阅读 2017-07-22 21:45:22
    1.支持客户/服务器模式。...由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4.无连接:无连
  • 基于HTTP协议实现的小型web服务器

    万次阅读 多人点赞 2017-08-12 08:44:43
    1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源 2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面...
  • 美国 免费服务器

    万次阅读 2017-10-15 16:47:16
    美国 免费服务器  http://www.fastly.com/ http://www.cloudflare.com/ http://www.rackspace.com/
  • 接收邮件服务器 常用邮箱登陆入口: http://mail.163.com/ http://mail.sina.com.cn/ http://mail.sohu.com/ http://mail.tom.com/ http://mail.sogou.com/ http://www.126.com/ http://mail.10086.cn/ ...
  • 【合集】用Raspberry Pi(树莓派)打造各种服务器 Raspberry Pi(树莓派)有很多的应用,其中搭建服务器是大家应用比较多的,今天就整理一个合集用Raspberry Pi(树莓派)打造各种服务器。 欢迎大家提出宝贵意见...
  • Linux设置代理服务器

    万次阅读 2018-08-30 10:03:29
    Windows搭建代理服务器 参考百度文档 Linux设置全局代理 打开/etc/skel/.bash_profile添加 http_proxy=http://192.168.5.100:8080 https_proxy=http://192.168.5.100:8080 export http_proxy https_proxy 执行...
  • 在之前的博文中, 我陆续说过如何搭建ftp, sftp, tftp服务器, 在本文中, 我们来继续聊如何实战搭建一个http服务器http服务器有很多种, 如tomcat,apache等, 然而, 很多新手无法搭建和配置成功, 颇为受挫,...
  • 一、安装WEB服务器 1.选择添加角色和功能 2.一直下一步到选择web服务器 3.添加功能 4.角色服务可以按需选择,这里直接默认 5.一直下一步,耐心等待安装成功 二、配置IIS 1.安装成功后右键IIS就可以...
  • 常见HTTP错误代码大全

    万次阅读 多人点赞 2011-06-24 15:10:00
    一些常见的状态码为:200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码 说明100 (继续) 请求者应当继续提出请求...
  • 常见邮件服务器(接收服务器和发送邮件服务器)地址 ,平时设置ootlook的时候可以查看。 腾讯QQ邮箱 接收服务器:pop.qq.com 发送服务器:smtp.qq.com  网易126邮箱 接收服务器:pop3.126.com ...
  • 常用的POP3和SMTP邮件服务器

    万次阅读 2011-05-22 12:16:00
    常用POP3和SMTP服务器地址
  • http://blog.51cto.com/sopace/1422520
1 2 3 4 5 ... 20
收藏数 2,447,387
精华内容 978,954
关键字:

http服务器