资源描述:
《web服务器实现(套接字编程)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Web服务器实现高崇铭2012001010016简单Web服务器详细设计说明书英才实验1班高崇铭20120010100161、引言:本程序为windous下用C++语言实现的简单的一个Web服务器,其功能很简单,开启时候能够监听到外部客户端发来的HTTP请求,解析请求文件,在本机进行搜索,最终以HTTP报文形式返回该文件。由于这只是一个简单的服务器架构,并没有考虑很好的鲁棒性,即返回报文中只有200OK的字段,并未考虑其他可能性。但在该程序的基础上,这些功能都很容易扩展。整个程序的思路框架如下图:Web服务器实现高崇
2、铭20120010100162、组织结构:3、程序:3.1:主函数(1)函数:main(intargc,char**argv)(2)函数功能:包含socket(),bind(),listen(),accept(),recv(),closesocket()这一系列的套接字函数,负责建立套接字,绑定套接字与本机信息,分配端口号,监听并接收来自服务器的请求报文,将HTTP报文交给解析函数http_send_response(),最后关闭套接字。(3)参数说明:intargc:参数个数char**argv:端口号(4)返回值
3、:空特殊说明:所用socket函数如下:(1)函数:socket(intaf,inttype,intprotocol);(2)函数功能:创建一个套接字,出现在地址族中,但并未赋名。即只是创建了一个套接字的描述,Web服务器实现高崇铭2012001010016此时没有IP和端口号与其关联。(3)参数说明:af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPAInternet地址格式。type:指定socket类型。其中所用SOCK_STREAM提供有序的、可靠的、双向的和基于连接的字节流,使用带外数据传送机
4、制,为Internet地址族使用TCPprotocol:指定协议,0为缺省。(4)返回值:若创建套接字失败,则返回INVALID_SOCKET。(1)函数:bind(SOCKETs,conststructsockaddrFAR*name,intnamelen);(2)函数功能:将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一
5、个本地名字来为套接口建立本地捆绑(主机地址/端口号)。(3)参数说明:s:标识一未捆绑套接口的描述字。name:赋予套接口的地址。namelen:name名字的长度。(4)返回值:绑定成功返回0,失败返回-1或SOCKET_ERROR(1)函数:listen(SOCKETs,intbacklog);(2)函数功能:Listen()将上一步bind()函数绑定过IP与端口号的套接字申请进入的连接建立一个后备日志,即为监听连接请求(3)参数说明:s:标识一未捆绑套接口的描述字。name:赋予套接口的地址。namelen:
6、name名字的长度。(4)返回值:绑定成功返回0,失败返回-1或SOCKET_ERROR(1)函数:accept(SOCKETs,structsockaddr*addr,int*addrlen);(2)函数功能:在到达listen()监听函数的请求连接队列中抽取第一个连接,创建一个相同SOCKET类型的套接字并返回句柄,即赋予新的端口号(3)参数说明:s:套接口描述字,该套接口在listen()后监听连接。Web服务器实现高崇铭2012001010016addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接
7、实体的地址。addr参数的实际格式由套接口创建时所产生的地址族确定。addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。(4)返回值:成功返回一个新的套接字描述符,失败返回-1或INVALID_SOCKET。(1)函数:recv( SOCKET s,charFAR*buf,intlen,intflags);(2)函数功能:如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就
8、一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的);(3)参数说明:s:一个标识已连接套接口的描述字。b