C#端口转发用法详解
作者:chongq 发布时间:2022-09-05 08:47:08
标签:C#,端口,转发
本文实例讲述了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#程序设计有所帮助。


猜你喜欢
- 今天在使用Nlog的时候,发现了一个之前没注意的问题。以前,我的app配置文件都是这么写的,当然配置比较多的时候会改用xml。 如
- 现在有一张订单表t_stockorder,其拥有id、code、client_id、merchandise_id、merchandise_n
- 这几天在排查一个堆外内存泄漏的问题时看到很多人都提到了gperftools这个神器,想要尝试一下结果发现它对macOS的支持不太友好。而且大
- XmlTextReader 提供对 XML 数据流的只进只读访问。当前节点指读取器定位到的节点。使用任何读方法推进读取器并且属性反映当前节点
- 本文实例为大家分享了android实现简单仪表盘效果的具体代码,供大家参考,具体内容如下实现这个效果:中间的文字很好写,外层的进度条就需要自
- Android TimePicker 直接输入的问题解决方案TimePicker 提供了上下的按钮,点击按钮,相关操作都是正常的。但是如果直
- 本文实例为大家分享了AsyncTask异步类实现网页内容放大缩小的详细代码,供大家参考,具体内容如下WebActivity.java:pac
- 经常在代码中,需要使用 DEBUG 来输出一些奇怪的东西来进行测试。但是输出的窗口只有一个,如果有一个逗比在不停输出,那么就会让输出窗口看不
- 前言文件上传是项目开发中最常见的功能之一 ,SpringMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配Multi
- 在C#中怎样禁用鼠标按键,我们可以通过ImessageFilter接口下的PreFilterMessage方法、Application类的A
- Input源码解读——从"Show tabs"开始本文基于Android T版本
- 一、启动android默认浏览器这样子,android就可以调用起手机默认的浏览器访问。二、指定相应的浏览器访问1、指定android自带的
- 本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时
- gradle文件执行流程做过Android开发的同学都知道 ,Android项目中存在三个gradle文件,那你是否知道他们的执行流程呢?请
- 一,块作用域首先在深入学习控制结构之前,需要先了解块(block)的概念。块:即复合语句,是指由一对大括号括起来的若干条简单的 Java 语
- 有些人可能对线程池比较陌生,并且更不熟悉线程池的工作原理。所以他们在使用线程的时候,多数情况下都是new Thread来实现多线程。但是,往
- 本文实例为大家分享了Java多线程实现第三方数据同步的具体代码,供大家参考,具体内容如下一、场景最近的一项开发任务是同步第三方数据,而第三方
- jar包打包实现jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的
- 前言身在孤岛有很多无奈,比如说程序员属于比较偏门的职业。尤其是早些年,在行业里跳过几次槽后,可能你就已经认识整个圈子的人了。然后,再跳槽很可
- 常见Bean后处理器的作用:public static void main(String[] args) { &