程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#端口轉發用法詳解

C#端口轉發用法詳解

編輯:C#入門知識

C#端口轉發用法詳解。本站提示廣大學習愛好者:(C#端口轉發用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是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#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved