计算机网络·实验一:
程序流程:
1.初始化套接字。
2.代理服务器运行,不断监听
3.当客户端连接之后,读取客户端的 HTTP 请求报文,通过请求行中的 URL,解析客户期望访问的原服务器 IP 地址; 创建访问原(目标)服务器的 TCP 套接字转发给客户端
4.将 HTTP 请求报文转发给目 标服务器,接收目标服务器的响应报文
5.当收到响应报文之后,将响应 报文转发给客户端,最后关闭套接字,等待下一次连接。
1.使用Socket的应用程序在使用Socket之前必须首先调用 WSAStartup函数 调用WSAStartup(wVersionRequested, &wsaData)启动,
这里的wVersionRequested是WSADATA类型
2.创建套接字:
//socket()函数创建与指定的服务提供者绑定套接字
//参数 af:指定协议的地址家族,通常使用AF_INET
//参数 type:指定的套接字类型,SOCK_STREAM(TCP), SOCK_DGRAM, SOCK_RAW
//参数 protocal:套接字使用的协议
//socket() 函数执行成功,返回新Socket的句柄,调用失败返回INVALID_SOCKET
//假如调用socket() 函数创建Socket后,该Socket就存在一个命名空间中,但并没有为其指定一个名称
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
3.绑定套接字:
bind(ProxyServer, (SOCKADDR*)&ProxyServerAddr, sizeof(SOCKADDR)) == SOCKET_ERROR;
4.在while循环中监听端口:
初始化时置服务器端的流套接字处于监听状态listen(ProxyServer, SOMAXCONN) == SOCKET_ERROR;
服务程序调用accept函数从处于监听状态的流套接字sd的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道
启动线程来处理客户事件。
5.在线程中分配每个线程的空间,并且处理客户端的http请求。
获取请求之后对http头进行解析,并缓存收到的一切内容,在文件中查找该http中的url并将文件名存为它的url。假如没有这个文件,就发新的请求,假如有,就在本地读取并显示。有缓存时,判断返回的状态码是否是304,若是则将缓存的内容发送给客户端。假如被屏蔽,打印字符串显示被屏蔽的信息,如果被钓鱼,就跳转到被钓鱼的网址,把主机名给修改了。如果过程中出现错误,就关闭该套接字,并结束该条进程。
6.最后关闭代理服务器套接字,调用WSACleanup();结束程序。
流程图: