C#端口转发用法详解
作者:chongq 时间:2022-09-05 08:47:08
本文实例讲述了C#端口转发用法。分享给大家供大家参考。具体分析如下:
这里以链接3389的时候为例
例子1:连接a机器的3389端口连不上,因为对方防火墙或者网关做了限制,只能访问a机器的个别端口比如80。
例子2:连接a机器的几乎所有端口都连不上(对方乃内网或者防火墙网关做了限制),只能1433上去,但是对方可以连接你的某些端口。
解决方法:
第一种较简单,只需要程序在对方开80,你连接他80,程序收到数据后,发送到他本机的3389,同时从他3389收到数据后返回到你。程序就是一个中转站。
using System;
using System.Net.Sockets;
using System.Threading;
namespace PortTransponder
{
class Program
{
static void Main(string[] args)
{
TcpListener tl = new TcpListener(80);
//这里开对方可以被你连接并且未被占用的端口
tl.Start();
while (true)
//这里必须用循环,可以接收不止一个客户
//因为我发现终端服务有时一个端口不行就换一个端口重连
{
//下面的意思就是一旦程序收到你发送的数据包后立刻开2个线程做中转
try
{
TcpClient tc1 = tl.AcceptTcpClient();
//这里是等待数据再执行下边,不会100%占用cpu
TcpClient tc2 = new TcpClient("localhost", 3389);
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 { }
}
}
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);
}
catch
{
ns1.Dispose();
ns2.Dispose();
tc1.Close();
tc2.Close();
break;
}
}
}
}
}
希望本文所述对大家的C#程序设计有所帮助。
标签:C#,端口,转发
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java 排序算法之快速排序
2022-07-23 17:39:03
![](https://img.aspxhome.com/file/2023/4/69314_0s.png)
JVM教程之内存管理和垃圾回收(三)
2023-11-10 15:49:54
![](https://img.aspxhome.com/file/2023/2/59352_0s.jpg)
java中动态 代理的实现
2023-11-17 16:16:25
Java实现PDF转为Word文档的示例代码
2021-10-05 02:19:26
![](https://img.aspxhome.com/file/2023/7/62657_0s.jpg)
JAVA实现长连接(含心跳检测Demo)
2023-08-05 09:51:13
DUCC配置平台实现一个动态化线程池示例代码
2023-11-28 12:07:39
![](https://img.aspxhome.com/file/2023/4/60354_0s.png)
Java 多线程等待优雅的实现方式之Phaser同步屏障
2023-11-29 09:47:43
![](https://img.aspxhome.com/file/2023/9/60549_0s.png)
Java 添加和删除PDF图层的示例代码
2022-09-03 00:29:01
![](https://img.aspxhome.com/file/2023/2/66512_0s.gif)
Spring集成Druid连接池及监控配置的全过程
2023-08-25 05:22:20
![](https://img.aspxhome.com/file/2023/8/63448_0s.png)
springboot开启声明式事务的方法
2021-06-18 23:50:48
详解IntelliJ IDEA创建spark项目的两种方式
2023-12-05 05:48:21
![](https://img.aspxhome.com/file/2023/0/69660_0s.png)
教你使用Java获取当前时间戳的详细代码
2021-09-19 04:41:02
SpringBoot之通过BeanPostProcessor动态注入ID生成器案例详解
2023-11-24 22:17:26
![](https://img.aspxhome.com/file/2023/1/59251_0s.jpg)
java多线程-读写锁原理
2021-07-20 17:28:52
详解Kotlin:forEach也能break和continue
2022-05-03 01:24:10
C#开发中常用的加密解密方法汇总
2021-09-06 23:35:49
SpringMVC实现数据绑定及表单标签
2022-03-24 18:06:47
![](https://img.aspxhome.com/file/2023/8/68568_0s.png)
MyBatis基础支持DataSource实现源码解析
2023-01-16 09:58:07
Java JDK 动态 代理的使用方法示例
2023-08-23 08:12:52
JAVA字符串占位符使用方法实例
2021-09-20 17:30:27