人如果没有梦想那和咸鱼有什么区别,即使是做咸鱼也要做最咸的那一条

—— Wy

C#Socket使用代理服务器进行连接

C#Socket如何使用代理服务器进行连接,现在很多网站都使用WebSocket,这时可以使用Socket类进行模拟进行(当然也可以使用第三方类库),模拟多用户势必就会用到代理了,那么Socket如何使用代理呢???


这里我们需要两个方法


internal class SocketHelper
    {

        /// <summary>
        /// 建立Tcp连接
        /// </summary>
        /// <param name="host"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public static Socket InitTcp(string host, int port)
        {
            bool flag = IPAddress.TryParse(host, out IPAddress hostadd);
            if (!flag)
            {
                IPHostEntry hostInfo = Dns.GetHostEntry(host);
                hostadd = hostInfo.AddressList[0]; //域名转IP
            }
            IPEndPoint ipe = new IPEndPoint(hostadd, port);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s.Connect(ipe);
            return s;
        }
    }


这是一个创建TCP连接的方法


static bool ConnectProxyServer(string strRemoteHost, int iRemotePort, Socket sProxyServer)
        {
            //构造Socks5代理服务器第一连接头(无用户名密码)
            byte[] bySock5Send = new Byte[10];
            bySock5Send[0] = 5;
            bySock5Send[1] = 1;
            bySock5Send[2] = 0;
            //发送Socks5代理第一次连接信息
            sProxyServer.Send(bySock5Send, 3, SocketFlags.None);
            byte[] bySock5Receive = new byte[10];
            int iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);
            if (iRecCount < 2)
            {
                sProxyServer.Close();
                throw new Exception("不能获得代理服务器正确响应。");
            }
            if (bySock5Receive[0] != 5 || (bySock5Receive[1] != 0 && bySock5Receive[1] != 2))
            {
                sProxyServer.Close();
                throw new Exception("代理服务其返回的响应错误。");
            }
            if (bySock5Receive[1] == 0)
            {
                bySock5Send[0] = 5;
                bySock5Send[1] = 1;
                bySock5Send[2] = 0;
                bySock5Send[3] = 1;

                string strIp = strRemoteHost;
                bool flag = IPAddress.TryParse(strRemoteHost, out IPAddress hostadd);
                //如果传进来的不是IP
                if (!flag)
                {
                    IPAddress ipAdd = Dns.GetHostEntry(strRemoteHost).AddressList[0];
                    strIp = ipAdd.ToString();
                }
                string[] strAryTemp = strIp.Split(new char[] { '.' });
                bySock5Send[4] = Convert.ToByte(strAryTemp[0]);
                bySock5Send[5] = Convert.ToByte(strAryTemp[1]);
                bySock5Send[6] = Convert.ToByte(strAryTemp[2]);
                bySock5Send[7] = Convert.ToByte(strAryTemp[3]);
                bySock5Send[8] = (byte)(iRemotePort / 256);
                bySock5Send[9] = (byte)(iRemotePort % 256);
                sProxyServer.Send(bySock5Send, bySock5Send.Length, SocketFlags.None);
                iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);
                if (bySock5Receive[0] != 5 || bySock5Receive[1] != 0)
                {
                    sProxyServer.Close();
                    throw new Exception("第二次连接Socks5代理返回数据出错。");
                }
                return true;
            }
            else
            {
                if (bySock5Receive[1] == 2)
                    throw new Exception("代理服务器需要进行身份确认。");
                else return false;
            }
        }


这个就是代理方法了,如何调用请继续往下看!!!


var tcpClient = SocketHelper.InitTcp(代理IP, 代理端口);
ConnectProxyServer(请求地址, 请求端口, tcpClient);


先使用InitTcp连接代理服务器!!!然后使用ConnectProxyServer方法请求连接实际地址😀


后面发送获取数据和原来的一样!!!



评论

用户默认头像
发表我的评论
取消评论
看不清,点击刷新验证码