欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#端口轉發(fā)用法詳解

 更新時間:2015年03月23日 09:50:40   作者:chongq  
這篇文章主要介紹了C#端口轉發(fā)用法,以實例形式較為詳細的分析了C#實現(xiàn)端口轉發(fā)的技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了C#端口轉發(fā)用法。分享給大家供大家參考。具體分析如下:

這里以鏈接3389的時候為例

例子1:連接a機器的3389端口連不上,因為對方防火墻或者網(wǎng)關做了限制,只能訪問a機器的個別端口比如80。

例子2:連接a機器的幾乎所有端口都連不上(對方乃內(nèi)網(wǎng)或者防火墻網(wǎng)關做了限制),只能1433上去,但是對方可以連接你的某些端口。

解決方法:

第一種較簡單,只需要程序在對方開80,你連接他80,程序收到數(shù)據(jù)后,發(fā)送到他本機的3389,同時從他3389收到數(shù)據(jù)后返回到你。程序就是一個中轉站。

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)
//這里必須用循環(huán),可以接收不止一個客戶
//因為我發(fā)現(xiàn)終端服務有時一個端口不行就換一個端口重連
      {
//下面的意思就是一旦程序收到你發(fā)送的數(shù)據(jù)包后立刻開2個線程做中轉
        try
        {
          TcpClient tc1 = tl.AcceptTcpClient();
//這里是等待數(shù)據(jù)再執(zhí)行下邊,不會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#程序設計有所幫助。

相關文章

最新評論