• 简单实现Http代理工具端口复用与QQ代理


    话说上一次做完http代理工具后,没有测试QQ代理,回家试了一下,做了一下简单补充,并测试通过。

    上次的文章提到,所有公司的服务器端口都封了,只剩下几个通讯的已经正在便用的。

    于是,在本地XP下试了一下端口劫持,也称端口复用。抢占80端口。

    关键代码就一句:tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

    在本地实现抢占80端口后,所有的http请求本地iis的,就出现访问不了的情况,所以我又实现了给IIS中转请求

    即收到消息后,分析是否IIS请求,如果是,则转发请求到IIS,其它的就转发给相应其它的网站。

    由于转发给本机的IIS请求速度过快,这时候需要适当延时,不然问题又出来了。

    端口复用在win2003下是不支持的,我也没办法。

    但是可通过不同IP监听同一端口如:192.168.1.48 8000 和192.168.1.49 8000(此时需要为主机分配多个IP)

    接下来继续上代码,并提供代码下载:

    Proxy.cs

    Proxy代理类
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
    using System.Net.Sockets;
    using System.Threading;
    namespace TcpProxy
    {
        
    /// <summary>
        
    /// by 路过秋天
        
    /// http://www.cnblogs.com/cyq1162
        
    /// </summary>
        class Program
        {
          
            
    static void Main(string[] args)
            {
                    Listen(
    80);
            }
            
    static void Write(string msg)
            {
                Console.WriteLine(msg);
            }

            
    static void Listen(int port)
            {
                Write(
    "准备监听端口:" + port);
                System.Net.IPAddress[] ips 
    = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());
                
    foreach (System.Net.IPAddress ip in ips)
                {
                    Write(ip.ToString());
                }
                System.Net.IPAddress ipp 
    = System.Net.IPAddress.Parse("0.0.0.0");
                TcpListener tcplistener 
    = new TcpListener(ipp,port);
                
    //tcplistener.ExclusiveAddressUse = false;
               tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
               
    //tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.,ProtocolType.IP);
                try
                {
                    tcplistener.Start();
                }
                
    catch(Exception err)
                {
                    Write(err.Message);
                    Write(
    "该端口已被占用,请更换端口号!!!");
                    ReListen(tcplistener);
                }
               
                Write(
    "确认:y/n (yes or no):");
                
    string isOK = Console.ReadLine();
                
    if (isOK == "y")
                {
                    Write(
    "成功监听端口:" + port);
                    
    //侦听端口号 
                    Socket socket;
                    
    while (true)
                    {
                        socket 
    = tcplistener.AcceptSocket();
                        
    //并获取传送和接收数据的Scoket实例 
                        Proxy proxy = new Proxy(socket);
                        
    //Proxy类实例化 
                        Thread thread = new Thread(new ThreadStart(proxy.Run));
                        
    //创建线程 
                        thread.Start();
                        System.Threading.Thread.Sleep(
    200);
                        
    //启动线程 
                    }
                }
                
    else
                {
                    ReListen(tcplistener);
                }
            }
            
    static void ReListen(TcpListener listener)
            {
                
    if (listener != null)
                {
                    listener.Stop();
                    listener 
    = null;
                }
                Write(
    "请输入监听端口号:");
                
    string newPort = Console.ReadLine();
                
    int port;
                
    if (int.TryParse(newPort, out port))
                {
                    Listen(port);
                }
                
    else
                {
                    ReListen(listener);
                }
            }
        }
    }

    Program.cs

    Main函数入口
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
    using System.Net.Sockets;
    using System.Threading;
    namespace TcpProxy
    {
        
    /// <summary>
        
    /// by 路过秋天
        
    /// http://www.cnblogs.com/cyq1162
        
    /// </summary>
        class Program
        {
          
            
    static void Main(string[] args)
            {
                    Listen(
    80);
            }
            
    static void Write(string msg)
            {
                Console.WriteLine(msg);
            }

            
    static void Listen(int port)
            {
                Write(
    "准备监听端口:" + port);
                System.Net.IPAddress[] ips 
    = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());
                
    foreach (System.Net.IPAddress ip in ips)
                {
                    Write(ip.ToString());
                }
                System.Net.IPAddress ipp 
    = System.Net.IPAddress.Parse("0.0.0.0");
                TcpListener tcplistener 
    = new TcpListener(ipp,port);
                
    //tcplistener.ExclusiveAddressUse = false;
               tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
               
    //tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.,ProtocolType.IP);
                try
                {
                    tcplistener.Start();
                }
                
    catch(Exception err)
                {
                    Write(err.Message);
                    Write(
    "该端口已被占用,请更换端口号!!!");
                    ReListen(tcplistener);
                }
               
                Write(
    "确认:y/n (yes or no):");
                
    string isOK = Console.ReadLine();
                
    if (isOK == "y")
                {
                    Write(
    "成功监听端口:" + port);
                    
    //侦听端口号 
                    Socket socket;
                    
    while (true)
                    {
                        socket 
    = tcplistener.AcceptSocket();
                        
    //并获取传送和接收数据的Scoket实例 
                        Proxy proxy = new Proxy(socket);
                        
    //Proxy类实例化 
                        Thread thread = new Thread(new ThreadStart(proxy.Run));
                        
    //创建线程 
                        thread.Start();
                        System.Threading.Thread.Sleep(
    200);
                        
    //启动线程 
                    }
                }
                
    else
                {
                    ReListen(tcplistener);
                }
            }
            
    static void ReListen(TcpListener listener)
            {
                
    if (listener != null)
                {
                    listener.Stop();
                    listener 
    = null;
                }
                Write(
    "请输入监听端口号:");
                
    string newPort = Console.ReadLine();
                
    int port;
                
    if (int.TryParse(newPort, out port))
                {
                    Listen(port);
                }
                
    else
                {
                    ReListen(listener);
                }
            }
        }
    }

    OK,打完收下。

    点击此处下载代码

    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    一串东西跟着鼠标走
    仿select下拉框
    MD5,DES,RSA
    网站访问量统计
    linux 下 apache启动、停止、重启命令
    Blender绘制大脑表层,并高亮染色
    树莓派搭建LAMP,然后更改根目录
    树莓派使用Samba共享文件夹
    树莓派挂载移动硬盘
    [原创]一种基于Python爬虫和Lucene检索的垂直搜索引擎的实现方法介绍
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1753503.html
Copyright © 2020-2023  润新知