计算机网络·实验一:

程序流程:

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();结束程序。

流程图:

原文地址:https://www.cnblogs.com/hitWTJ/p/9880225.html