技术社区

c#搭建一个代理服务器,需要给浏览器返回什么数据
admin | 发表于: 2017-12-22 回答
想写一个代理服务器,(就是客户在IE设置里填入代理服务器,端口8000)

现在的情况,可以收集客户的数据包,也转发了HTTP请求,通过断点也检测到了,返回了客户请求的网页源码。

最后返回给客户端的时候,客户浏览器死活显示不出来,应该返回什么样的数据?不能直接把web的数据转发过去么?

上代码:

string clientmessage = " ";//来自客户端的HTTP请求字符串
string URL = " ";//存放解析出地址请求信息
            int bytes = ReadMessage(read, ref clientSocket, ref clientmessage);
            if (bytes == 0)
            {
                return;
            }
            int index1 = clientmessage.IndexOf(' ');
            int index2 = clientmessage.IndexOf(' ', index1 + 1);
            if ((index1 == -1) || (index2 == -1))
            {
                return;
                throw new IOException();
            }
            URL = clientmessage.Substring(index1 + 1, index2 - index1 -1);
            try
            {
                int ports = 80;
                if (URL.Contains("http://"))
                {
                    URL = URL.Replace("http://","");
                }
                else if (URL.Contains("https://"))
                {
                    URL = URL.Replace("https://", "");
                    ports = 443;
                }
                if (URL.Contains(':'))
                {
                    int index3 = URL.IndexOf(':');
                    ports = int.Parse(URL.Substring(index3 + 1));
                    URL = URL.Substring(0, index3);
                }
                IPHostEntry IPHost = Dns.GetHostEntry(URL);
                Console.WriteLine("远程主机名: " + IPHost.HostName);
                string[] aliases = IPHost.Aliases;
                IPAddress[] address = IPHost.AddressList;
                Console.WriteLine("Web服务器IP地址:" + address[0]);
                //解析出要访问的服务器地址
                IPEndPoint ipEndpoint = new IPEndPoint(address[0], ports);
                
                Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //创建连接Web服务器端的Socket对象
                IPsocket.Connect(address[0], ports);
                //Socket连Web接服务器
                if (IPsocket.Connected)
                {
                    //Socket 正确连接!
                }
                    
                string GET = clientmessage;
                Byte[] ByteGet = ASCII.GetBytes(GET);
                IPsocket.Send(ByteGet, ByteGet.Length, 0);
                //代理访问软件对服务器端传送HTTP请求命令
                Int32 rBytes = 0;
                try
                {
                    rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);
                    SendMessage(ref clientSocket, ASCII.GetString(RecvBytes, 0, rBytes));
                }
                catch(SocketException ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                //代理访问软件接收来自Web服务器端的反馈信息
                String strRetPage = null;
                strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);
                while (rBytes > 0)
                {
                    rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);
                    strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);
                    SendMessage(ref clientSocket, ASCII.GetString(RecvBytes, 0, rBytes));
                }
                IPsocket.Shutdown(SocketShutdown.Both);
                IPsocket.Close();


//sendmessage 函数
void SendMessage(ref Socket s, string message)
        {
            if (message != null)
            {
                Buffer = new Byte[message.Length + 1];
                int length = ASCII.GetBytes(message, 0, message.Length, Buffer, 0);
                s.Send(Buffer, length, 0);
            }
            
        }

下断点看,消息是发了,客户机也接受到了,不过浏览器依然无法显示?是不是应该发特定格式的数据包?还是往什么端口发?

回复列表