C#端口轉(zhuǎn)發(fā)用法詳解
本文實(shí)例講述了C#端口轉(zhuǎn)發(fā)用法。分享給大家供大家參考。具體分析如下:
這里以鏈接3389的時(shí)候?yàn)槔?/p>
例子1:連接a機(jī)器的3389端口連不上,因?yàn)閷?duì)方防火墻或者網(wǎng)關(guān)做了限制,只能訪問(wèn)a機(jī)器的個(gè)別端口比如80。
例子2:連接a機(jī)器的幾乎所有端口都連不上(對(duì)方乃內(nèi)網(wǎng)或者防火墻網(wǎng)關(guān)做了限制),只能1433上去,但是對(duì)方可以連接你的某些端口。
解決方法:
第一種較簡(jiǎn)單,只需要程序在對(duì)方開(kāi)80,你連接他80,程序收到數(shù)據(jù)后,發(fā)送到他本機(jī)的3389,同時(shí)從他3389收到數(shù)據(jù)后返回到你。程序就是一個(gè)中轉(zhuǎn)站。
using System;
using System.Net.Sockets;
using System.Threading;
namespace PortTransponder
{
class Program
{
static void Main(string[] args)
{
TcpListener tl = new TcpListener(80);
//這里開(kāi)對(duì)方可以被你連接并且未被占用的端口
tl.Start();
while (true)
//這里必須用循環(huán),可以接收不止一個(gè)客戶
//因?yàn)槲野l(fā)現(xiàn)終端服務(wù)有時(shí)一個(gè)端口不行就換一個(gè)端口重連
{
//下面的意思就是一旦程序收到你發(fā)送的數(shù)據(jù)包后立刻開(kāi)2個(gè)線程做中轉(zhuǎn)
try
{
TcpClient tc1 = tl.AcceptTcpClient();
//這里是等待數(shù)據(jù)再執(zhí)行下邊,不會(huì)100%占用cpu
TcpClient tc2 = new TcpClient("localhost", 3389);
tc1.SendTimeout = 300000;
//設(shè)定超時(shí),否則端口將一直被占用,即使失去連接
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,否則連接一旦中斷程序就崩潰了
//要是彈出錯(cuò)誤提示讓機(jī)主看見(jiàn)那就囧了
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;
}
}
}
}
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- c# 防火墻添加/刪除 特定端口的示例
- C#檢測(cè)遠(yuǎn)程計(jì)算機(jī)端口是否打開(kāi)的方法
- 基于C#實(shí)現(xiàn)的端口掃描器實(shí)例代碼
- c#檢測(cè)端口是否被占用的簡(jiǎn)單實(shí)例
- C#獲取Windows進(jìn)程監(jiān)聽(tīng)的TCP/UDP端口實(shí)例
- C#開(kāi)發(fā)之Socket網(wǎng)絡(luò)編程TCP/IP層次模型、端口及報(bào)文等探討
- asp.net(c#)動(dòng)態(tài)修改webservice的地址和端口(動(dòng)態(tài)修改配置文件)
- c# 連接字符串?dāng)?shù)據(jù)庫(kù)服務(wù)器端口號(hào) .net狀態(tài)服務(wù)器端口號(hào)
- c# AcceptEx與完成端口(IOCP)結(jié)合的示例
相關(guān)文章
基于C#實(shí)現(xiàn)Windows后臺(tái)窗口操作與圖像處理技術(shù)分析
在Windows編程中,操作后臺(tái)窗口是一項(xiàng)復(fù)雜而有用的技術(shù),它可以用來(lái)自動(dòng)化用戶界面測(cè)試、應(yīng)用程序機(jī)器人等場(chǎng)景,本文將深入探討如何在C#中綁定后臺(tái)窗口、獲取后臺(tái)窗口界面圖片,以及在圖片中尋找指定圖標(biāo)并獲取坐標(biāo),需要的朋友可以參考下2024-12-12
C#實(shí)現(xiàn)WinForm控件焦點(diǎn)的獲取與失去
在一個(gè)數(shù)據(jù)輸入表單中,當(dāng)用戶從一個(gè)文本框切換到另一個(gè)文本框時(shí),需要準(zhǔn)確地判斷焦點(diǎn)的轉(zhuǎn)移,以便進(jìn)行數(shù)據(jù)驗(yàn)證、提示信息顯示等操作,本文將探討 Winform 控件獲取與失去焦點(diǎn)的相關(guān)知識(shí),需要的朋友可以參考下2025-01-01
C#中實(shí)現(xiàn)Fluent Interface的三種方法
這篇文章主要介紹了C#中實(shí)現(xiàn)Fluent Interface的三種方法,本文講解了Fluent Interface的簡(jiǎn)單實(shí)現(xiàn)、使用裝飾器模式和擴(kuò)展方法實(shí)現(xiàn)Fluent Interface等3種實(shí)現(xiàn)方法,需要的朋友可以參考下2015-03-03
C#使用FluentHttpClient實(shí)現(xiàn)請(qǐng)求WebApi
FluentHttpClient 是一個(gè)REST API 異步調(diào)用 HTTP 客戶端,調(diào)用過(guò)程非常便捷,下面我們就來(lái)學(xué)習(xí)一下C#如何使用FluentHttpClient實(shí)現(xiàn)請(qǐng)求WebApi吧2023-12-12

