异世篇葡京游戏网址‖电梯里的恶魔

“日前的黝黑吞噬了全方位,什么也不曾剩余…”

void handleAccept(int socket_fd)
{
    char buf[1024] = { '\0' };
    string cmd;
    string filename;
    recv(socket_fd, buf, sizeof(buf), 0);//1
    stringstream sstream;//2
    sstream << buf;
    sstream >> cmd;
    sstream >> filename;
    cout << cmd << " " << filename << endl;
    if (cmd=="GET")//3
    {
        ifstream file;
        filename = filename.substr(1, filename.length() - 1);
        file.open(filename ,ifstream::binary);//4
        string head = "HTTP/1.0 200 OK\r\nContent - type:text/plain\r\n\r\n";//5
        if (!file)
        {
            cout << "fail" << endl;
            closesocket(socket_fd);
            return;
        }
        if (filename.find(".html")!=string::npos|| filename.find(".htm")!=string::npos)
        {
            head = "HTTP/1.0 200 OK\r\nContent - type:text/html\r\n\r\n";
        }        
        if (filename.find(".png")!=string::npos)
        {
            head = "HTTP/1.0 200 OK\r\nContent - type:image/png\r\n\r\n";    
        }
        if (filename.find(".jpg")!=string::npos)
        {
            head = "HTTP/1.0 200 OK\r\nContent - type:image/jpg\r\n\r\n";        
        }
        send(socket_fd, head.c_str(), strlen(head.c_str()), 0);
        while (!file.eof())//6
        {    
            char buf[1024];
            memset(buf, 0, sizeof(buf));
            file.read(buf,sizeof(buf)-1);
            int n = file.gcount();
            send(socket_fd, buf,n,0);//1
        }
        file.close();//7
    }
    closesocket(socket_fd);//7

}

1 recv(socket_fd, buf, sizeof(buf), 0)和send(socket_fd, buf,n,0);

“唉,真是烦死了,整天哪来这么多的传单?”刚放完学,到停车棚里,就看见自身的车子车筐里就一群乱7八糟的传单,那时正是人山人海的时候,小编也无意收十。到电梯口时,又看见这传单,心生厌烦,但也无法不断乱扔,算了,反正一会坐电梯也无聊,看看那传单有如何坑爹的减价活动。拿着一批传单小编就进了电梯,作者正望开头里的传单,凭以为按下电梯按键,壹会回过神,作者去,竟然按错了,按成1二楼了,小编又按了弹指间一五楼,看来一会上楼时间又长了些。在夜晚,坐电梯怕的正是电梯突然停电和电梯停到3个没到过的楼宇,壹种未知的恐怖,会扑面而来,只怕1个什么东西在电梯门刚张开时就扑到你的日前,或是一双大手在电梯门刚张开时就把你拽了出来,消失在黑暗里,想着小编就看向手中的传单…

recv用于收纳从客户端发送来的音讯,send用于向服务端发送音信

recv/send函数原型如下

手里的传单无非是部分饭店、店四、医院怎样的打折活动,真没劲,突然一张画面奇异的传单引起了自己的注目,那是一个望而生畏体验游戏室的宣传单,名字为《电梯里的鬼魅》,是1所身处小编家超级市场旁边的三个游戏室,游戏者会在电梯里随便进入某三个楼宇的某贰个屋子,每1个屋子背后都会有例外的惊惶失措场所和恐惧经历。传单上还有部分玩耍室内恐怖场馆包车型大巴图样,有断臂残手、头颅眼球、骨肉横飞、还有腐尸等等,看起来不错哦,仿佛还很逼真,对于自身那种热衷恐怖的人的话,那但是八个不错的感受,放假了去瞧瞧。正想着,电梯门展开了。壹看电梯的显示屏,1二楼,还没到,作者就按下电梯的关门键,按了半天,电梯没一点感应,电梯坏了?不会刚好到一层楼就坏了吧,望向电梯外,黑漆漆的一片,电梯里仅有的光线也被攻陷在前面包车型地铁水绿里,这些小区才盖好不久,住的人不多而且楼道里也远非声音控制灯,灰黄一片果然有个别不安,电梯停在那一层动也不动,反正那多余三层楼了,走楼梯算了,于是自身就走出了电梯。

int recv(SOCKET s,char FAR * buf,int len,int flags)/int send(SOCKET
s,const char FAR * buf,int len,int flags);

首先个参数表示代表对方的socket,

刚走出电梯,电梯门就关上了!作者瞧着12楼仅有的辉煌一丝丝破灭,却不知道该怎么做,显示器展现电梯走到了壹五楼,停下后,荧屏也灭了,难道停电了?那电梯是在玩本身哟!辛亏笔者带的有部手提式有线电话机,张开手提式有线电话机的手电筒,光线不是很亮但仍可以辨清目前的事物,作者寻觅了1会,看层楼就如还未曾人家,防盗门连包装纸都没撕掉,突然本人就像是听见什么样动静,好像是滴水的响声,难道什么人家居装饰修漏水了?管她的,看了1晃小时,已经十点3伍了,作者搜寻着走到楼梯口,声音愈发清晰,1看楼梯口,从地点流动下一些暗色的液体,光线不是太亮,作者也糟糕辨认出是或不是水,踩着液体走上楼梯,刚走到转角处,看到的1幕差不多让自己呕吐出来,一具女尸被钉在墙上,4肢被截去扔在壹派,腹部也被剖开,肠子和内脏流了出来,鲜血流了一地,尸体上还在向下滴着血,原来楼道里的液体便是那血啊,尸体的脸被毛发盖着,也无所适从看清。这么害怕狂暴的现象,真令自个儿恐惧,想着小编要么当下报告警察方啊,打通1拾后说完自个儿就挂了,此地依然不宜久留,我当下就迈入走去,走到壹3楼,在拐弯处自个儿又看到了壹具女尸!等自家镇静下来,仔细一看,那不如故刚刚那具女尸!连地方都没变,再1想想,那不啻和自家刚刚在游戏室的宣传单上看看的图纸大致很像啊,难道…..怎么大概,小编怎么会进来那些游戏室,小编连门票都没付啊,但今日的事态和游乐里宣传的很像啊!作者又上壹层楼,看到的照旧同样的1幕,看来是鬼打墙了,瞧着钉在墙上的女尸,四妹,我只属路过而已,况且自身还帮您报警了,你就放小编走啊,虽说那女尸样子很恐怖,可是正是他主动也威逼不了作者如何,她有未有动作。“滴答..滴答…”血滴在地上的音响一下转眼敲打着我的心田,望着自个儿手里的手提式无线电话机,小编就像有方法了。

其次个参数为接到读取的音讯的字符串

其五个参数为该字符串的轻重

拿开首提式有线电话机作者给阿娘打电话:“妈,你快走楼梯下来接自个儿,电梯坏了,笔者前几日好像在12楼。”“电梯坏了?电梯好好的哟,作者刚才下楼倒垃圾了…”“哎哎,你快下来接自身吗。”说完就有点后悔,万壹阿妈看到楼梯墙上的女尸怎么做,无意间笔者瞥了壹眼手提式有线电话机显示屏,怎么今后如故拾点35!?小编爬了半天楼梯又傻眼壹会,不会连一分钟都没过去呢,不壹会,老母打来电话,“喂,你在哪呀,小编把1四,一3,12楼都跑了,都没见你的阴影,我前天在10贰楼。”“你看看墙上的女…呃..你见到楼道的墙上有怎样呢?”“没什么啊,唯有1部分贴的小广告,今后都1一点了,你快点爬上来吧。”“笔者上不去啊…喂喂…..”怎么?手机没电了?唉,该死的!作者只得硬着头皮向上爬,未来都11点了,怎么回事我都没见老母,作者那是怎么了,爬了半天,笔者估计都爬了十多层楼梯了,但是仍是能够听到“滴答滴答”的声音,不用想就理解依然不行女尸,小编大约都快绝望了,以至跳楼都想过了。那时突然壹道亮光从那边发出,电梯好了?笔者走了千古,看见电梯正在在减缓展开,张开后却绝非人出去,作者逐步走过去想看看电梯里有如何事物,忽然2个东西抓住作者的颈部把笔者拉了进入,小编竟然来比不上喊叫,也不如看清什么吸引笔者的颈部。

第拾3个参数能够用来决定读写操作

该值可认为一下两种

第三天,小区的众人围着电梯商议纷繁,电梯里躺着一具遗骸,那正是小编的遗骸,可想而知尸体是从楼上摔下来的,因为遗体差不多零七八碎,骨血模糊,脑浆眼球都摔了出来,警察也分析本身是摔死的,却尚未人注意到作者脖子上有一道勒痕,而他们也并未察觉楼道里有何女尸,昨夜电梯运维杰出,未有发出停电,电梯也从不发出故障……..

0

MSG_DONTROUTE:不查找路由表/* send without using routing tables */
MSG_OOB:接受或发送带外数据 /* process out-of-band data */

MSG_PEEK:查看数据,并不从系统缓冲区移走多少/* peek at incoming message
*/
MSG_WAITALL :等待别的数据/* do not complete until packet is
completely filled */

etc…

解释:
MSG_DONTROUTE:是send函数使用的标记.这些标志告诉IP协议.目标主机在本地互联网下边,完全没有要求查找路由表.这么些标记一般用网络检查判断和路由程式里面。
MSG_OOB:表示能够收到和发送带外的数据.关于带外数据我们今后会解释的.
MSG_PEEK:是recv函数的施用标识,表示只是从系统缓冲区中读取内容,而不免除系统缓冲区的内容。那样下次读的时候,依旧是平等的剧情。一般在有八个进度读写多少时能够利用那么些标记。

MSG_WAITALL:是recv函数的运用标识,表示等到其它的音信达到时才回去。使用那个标记的时候recv会一贯不通,直到钦点的条件满足,或是爆发了错误。

    壹)当读到了钦赐的字节时,函数正常重临,再次回到值等于len

    贰)当读到了文书档案的末尾时,函数日常重回.重临值小于len

    三)当操作发生错误时,重临-一,且布局错误为对应的谬误号(errno)
其余的几个选项,然而大家其实用的很少.

 

有关其他的发送和接受函数

recvfrom/sendto

那多个函数一般用在UDP中。

函数原型如下

int  recvfrom(SOCKET s,char FAR * buf,int len,int flags,struct sockaddr
FAR * from,int FAR * fromlen);

int  sendto(SOCKET s,const char FAR * buf,int len,int flags,const
struct sockaddr FAR * to,int tolen);

 

2 stringstream sstream;

字符串读写流,那里用于将char
buf[1024]的多少按私下认可的距离符读到cmd和filename中,关于cmd和filename的求实意思见三

也足以用来将数字调换为字符串

例如

stringstream sstream;

sstream <<123456789;
string a;
sstream >> a;
cout << a << endl;

将数字12345678玖转变为了字符串

 

 

三 HTTP协议请求

当客户端连接到服务端时,会时有发生一个http请求

http请求由叁有的组成,分别是:请求行、音讯报头、请求正文

那里只对请求行进行介绍

请求行以1个措施符号起首,以空格分开,后面跟着请求的U昂科威I和协议的本子,格式如下:Method
Request-UOdysseyI HTTP-Version C奥迪Q5LF  

其间
Method表示请求方法;Request-URI是3个合并能源标志符;HTTP-Version表示请求的HTTP协议版本;CCR-VLF表示回车和换行(除了作为最后的C揽胜LF外,不允许出现单独的C揽胜或LF字符)。

伸手方法(全部办法全为题写)有各类,各样艺术的分解如下:
GET     请求获取Request-UOdysseyI所标志的财富
POST    在Request-U奥迪Q7I所标志的财富后附加新的数码
HEAD    请求获取由Request-U讴歌RDXI所标记的能源的响应新闻报头
PUT     请求服务器存款和储蓄三个能源,并用Request-UHavalI作为其标记
DELETE  请求服务器删除Request-UEnclaveI所标记的财富
TRACE   请求服务器回送收到的伸手音信,主要用来测试或确诊
CONNECT 保留以后应用
OPTIONS 请求查询服务器的品质,可能查询与能源相关的选取和需求

在本程序中只对GET请求进行管理,将请求方法读入cmd中,和Request-U奥迪Q5L读入filename中,推断是否为GET,并获请求的财富名称

 

4 file.open(filename ,ifstream::binary);

开采客户所请求的文书,那里运用2进制的章程展开是为着便于对图片进行传输

 

 

5 string head = “HTTP/1.0 200 OK\r\nContent –
type:text/plain\r\n\r\n”;

在收取和表达请求音讯后,服务器重临一个HTTP响应音讯。

HTTP响应也是由两个部分组成,分别是:状态行、音讯报头、响应正文

一)、状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF

个中,HTTP-Version表示服务器HTTP协议的本子;Status-Code表示服务器发回的响应状态代码;Reason-南海滩se表示情状代码的文书描述。

相近景色代码、状态描述、表明:

200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不可能棉被和衣服务器所领会
40一 Unauthorized
//请求未经授权,那个状态代码必须和WWW-Authenticate报头域一同利用 
40三 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求财富不设有,eg:输入了错误的UEnclaveL
500 Internal Server Error //服务器发生不可预料的失实
50叁 Server Unavailable 
//服务器当前无法管理客户端的呼吁,一段时间后恐怕恢复生机符合规律

 

Content-Type表示正在传输的种类

Content – type:text/plain:普通文书

Content – type:text/html:html网页

Content – type:image/png:png图片

Content – type:image/jpg:jpg图片

二)响应报头允许服务器传递无法放在状态行中的叠加响应消息,以及关于服务器的音讯和对Request-U牧马人I所标记的能源举行下一步访问的消息。在那不做详细介绍

3)响应正文就是服务器重临的财富的剧情

 关于http协议更详细的1对能够参照http://blog.csdn.net/gueter/article/details/1524447 HTTP商业事务详解

 

 

6 获得响应正文并写到客户端

char buf[1024];
memset(buf, 0, sizeof(buf));//初始化

file.read(buf,sizeof(buf)-一);//由于我们采用贰进制的主意打开的文本所以选拔了read方法

int n =
file.gcount();//gcount()再次来到最终2个非格式化的收取方法读取的字符数,因为有时候读到的会小于拾二一个

send(socket_fd, buf,n,0);//将buf中的n个字符发送到客户端

 

7

file.close()和closesocket(socket_fd)

闭馆展开的文书和socket_fd

 

 程序代码下载:http://files.cnblogs.com/magicsoar/WebServer.rar

p.s

次第做的还不是很完美,对部分情景例如send,reve是不是正在奉行也一向不张开检讨,客户端请求的文件不存在也从没回来404,

笔者会在之后对程序进行周详的,并将有个别新的体会写出来。

先是次写博客,希望大家能提出自己的欠缺来,小编会虚心接受并改革的。

接下去只怕会将团结大一大贰做的软件,游戏拿出来,写一写,与大家大饱眼福,大概是读书的体会等,也大概会是本身眼下正在读书C++网络爬虫。