端口转发源码

2 篇文章 0 订阅
2 篇文章 0 订阅
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;


namespace PortTresferClient
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                args = new string[] {"8099","localhost","3389" };
            }
            TcpListener tl = new TcpListener(int.Parse(args[0]));//这里开对方可以被你连接并且未被占用的端口
            tl.Start();
            while (true)//这里必须用循环,可以接收不止一个客户,因为我发现终端服务有时一个端口不行就换一个端口重连
            {
                //下面的意思就是一旦程序收到你发送的数据包后立刻开2个线程做中转
                try
                {
                    TcpClient tc1 = tl.AcceptTcpClient();//这里是等待数据再执行下边,不会100%占用cpu
                    TcpClient tc2 = new TcpClient(args[1], int.Parse(args[2]));
                    tc1.SendTimeout = 300000;//设定超时,否则端口将一直被占用,即使失去连接
                    tc1.ReceiveTimeout = 300000;
                    tc2.SendTimeout = 300000;
                    tc2.ReceiveTimeout = 300000;
                    object obj1 = (object)(new TcpClient[] { tc1, tc2 });
                    object obj2 = (object)(new TcpClient[] { tc2, tc1 });
                    ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj1);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(transfer), obj2);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }


        public static void transfer(object obj)
        {
            TcpClient tc1 = ((TcpClient[])obj)[0];
            TcpClient tc2 = ((TcpClient[])obj)[1];
            NetworkStream ns1 = tc1.GetStream();
            NetworkStream ns2 = tc2.GetStream();
            while (true)
            {
                try
                {
                    //这里必须try catch,否则连接一旦中断程序就崩溃了,要是弹出错误提示让机主看见那就囧了


                    byte[] bt = new byte[10240];
                    int count = ns1.Read(bt, 0, bt.Length);
                    ns2.Write(bt, 0, count);
                    Console.WriteLine("From:" + tc1.Client.RemoteEndPoint.ToString() + "\tTo:" + tc2.Client.RemoteEndPoint.ToString() + "\t" + count + "bytes;");
                }
                catch
                {
                    ns1.Dispose();
                    ns2.Dispose();
                    tc1.Close();
                    tc2.Close();
                    break;
                }
            }
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: porttunnelc是一个开源项目,它是一个用C语言编写的端口转发工具。它的主要功能是将来自一个端口的数据转发到另一个端口上,实现网络数据的传输。 porttunnelc的源码包含了整个项目的实现代码。其中包括了各种功能的实现、网络通信的代码、错误处理以及用户界面等等。通过分析源码,我们可以了解到porttunnelc是如何实现端口转发的。 源码中的主要模块包括监听端口、接收连接、转发数据和错误处理等。通过网络编程的API函数,porttunnelc在指定端口上监听连接请求,一旦检测到客户端的连接请求,就会建立一个与客户端间的连接。然后,它会把来自客户端的数据接收并转发给目标端口上的服务器。同时,porttunnelc也会接收来自目标端口上服务器的数据,并将其发送给客户端。这样就实现了端口间的数据转发。 在源码中还提供了一些错误处理的代码,用于处理异常情况,如连接超时、连接错误等等。当出现错误时,porttunnelc会打印错误信息并终止转发过程。 总结来说,porttunnelc的源码实现了端口转发的功能,通过监听端口、接收数据、转发数据和错误处理等模块,实现了在两个端口之间传输数据的功能。通过研究和修改源码,我们可以根据自身需求对porttunnelc进行功能的扩展和定制。 ### 回答2: "porttunnelc" 是一个开源的项目,用于实现端口转发的功能。它可以在不同的计算机之间建立起连接,将特定的端口数据转发到目标机器。通过学习"porttunnelc"的源码,可以深入理解它的实现原理和内部逻辑。 该源码可以帮助理解以下几个关键点: 1. 网络编程:源码中会涉及到套接字编程、TCP/IP协议以及网络数据传输的细节。可以学习如何使用套接字建立网络连接、发送和接收数据,并处理网络异常和错误。 2. 多线程编程:为了实现并发转发多个端口的功能,"porttunnelc"往往采用多线程的方式。源码会涉及到线程的创建与管理、线程间的同步与通信,学习如何合理地并发处理多个连接请求,提高效率。 3. 端口转发原理:"porttunnelc"通过建立源端口和目标端口之间的转发通道,将数据从源端口发送至目标端口,实现端口之间的数据交换。源码中会有相关的实现细节,可以学习转发过程中的数据处理、缓冲和流量控制等内容。 4. 异常处理:在网络通信中,各种异常情况都可能发生,如网络中断、无法建立连接、数据丢失等。源码中会有相应的异常处理逻辑,可以学习如何应对不同的异常情况,提高系统的鲁棒性。 通过学习"porttunnelc"的源码,可以提高对端口转发原理和网络编程的理解,为自己的网络应用开发提供借鉴和参考。同时也能增加对多线程编程和异常处理的经验,提高自己解决实际问题的能力。 ### 回答3: porttunnelc是一个开源的网络工具,用于在本地主机和远程主机之间建立端口隧道连接。它基于C语言开发,具有高效、稳定的特点。 porttunnelc的源码主要由以下几个模块组成: 1. 主函数:源码中包含一个主函数,用于处理命令行参数和启动端口隧道连接。 2. 网络处理模块:该模块负责建立本地和远程主机之间的连接,这是整个工具的核心功能。它通过创建套接字(Socket)并使用Socket函数库来实现数据的传输。 3. 配置文件模块:porttunnelc支持通过配置文件进行参数设置,源码中有相应的模块用于读取和解析配置文件中的参数信息,例如本地和远程主机的IP地址、端口号等。 4. 错误处理模块:在源码中还包含了错误处理的相关代码,用于捕捉和处理运行过程中的错误。这样可以使程序具有更好的稳定性和可靠性。 5. 日志模块:porttunnelc还提供了日志功能,用于记录工具的运行情况、错误信息或其他需要记录的信息。源码中的日志模块可以实现将日志信息输出到文件或终端。 通过阅读porttunnelc的源码,我们可以了解到端口隧道连接的原理和实现方式,也可以根据需要对工具进行修改和优化。这是一个非常实用的网络工具,可以在需要时快速建立本地和远程主机之间的连接,方便进行网络通信或数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值