2012-09-05 25 views
2

我不知道,如果標題是所有信息。C#連接兩個TCP套接字一起

我試圖找到/寫一個套接字服務器將接受來自客戶端(遠程登錄)的連接,然後代表客戶端連接的,連接到網絡內四個Telnet服務器中的一個。

一旦連接上我保持多少個連接有一個計數器,然後如果有4個總連接,不允許任何新的連接,直到一四是可用的。

我寫了這個:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 
using System.Threading; 
using System.Net; 
using System.IO; 

namespace ConsoleApplication1 
{ 
class Program 
{ 
    static int nodeCount = 4; 
    static int currentNode = 1; 

    static void Main(string[] args) 
    { 
     ServerProgram server = new ServerProgram(); 
    } 

    class ServerProgram 
    { 
     private TcpListener tcpPrimaryListener; 
     private Thread listenThread; 

     public ServerProgram() 
     { 
      this.tcpPrimaryListener = new TcpListener(IPAddress.Any, 23); 
      Console.WriteLine("Telnet BBS Port Concentrator Server Started."); 
      Console.WriteLine("--------------------------------------------"); 

      this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
      this.listenThread.Start(); 
     } 

     private void ListenForClients() 
     { 
      this.tcpPrimaryListener.Start(); 

      while (true) 
      { 
       TcpClient client = this.tcpPrimaryListener.AcceptTcpClient(); 
       Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 
       clientThread.Start(client); 
      } 
     } 

     private void HandleClientComm(object client) 
     { 
      if (currentNode <= nodeCount) 
      { 
       Console.WriteLine("Connection thread created."); 

       StreamWriter swStream; 
       StreamWriter swStream2; 
       StreamReader srStream; 
       StreamReader srStream2; 

       TcpClient tcpClient = (TcpClient)client; 
       NetworkStream tcpClientStream = tcpClient.GetStream(); 

       TcpClient telnet = new TcpClient("192.168.100.5" + currentNode, 23); 
       NetworkStream telnetStream = telnet.GetStream(); 

       currentNode++; 

       while (true) 
       { 
        srStream = new StreamReader(tcpClient.GetStream()); 
        swStream2 = new StreamWriter(tcpClient.GetStream()); 

        srStream2 = new StreamReader(telnet.GetStream()); 
        swStream = new StreamWriter(telnet.GetStream()); 

        swStream.Write(srStream.ReadToEnd()); 
        swStream2.Write(srStream2.ReadToEnd()); 

       } 
      } 
     } 
    } 
} 
} 

我已經多次改變了這個例子,所以我真的不知道了我有什麼,並沒有嘗試過。我願意嘗試任何事情。

的目的實際上是運行這個允許一個telnet端口打開穿過防火牆,並允許連接到運行Telnet化石司機BBS軟件DOS機器的小型網絡。我只想將telnet流量重定向到僅使用一個端口的可用系統。

的問題是,我無法弄清楚如何真正將兩個插座連接在一起,它們之間傳遞數據,因爲它發生。傳入的套接字和我代表服務器創建的套接字創建到服務器。

謝謝。

UPDATE:

這是爲我工作,我還在找過的錯誤,但它的工作至今。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 
using System.Threading; 
using System.Net; 
using System.IO; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
class Program 
{ 
    static int nodeCount = 2; 
    static int currentNode = 1; 

    static void Main(string[] args) 
    { 
     ServerProgram server = new ServerProgram(); 
    } 

    class ServerProgram 
    { 
     private TcpListener tcpPrimaryListener; 
     private Thread listenThread; 

     public ServerProgram() 
     { 
      this.tcpPrimaryListener = new TcpListener(IPAddress.Any, 23); 
      Console.WriteLine("Telnet BBS Port Concentrator Server Started."); 
      Console.WriteLine("--------------------------------------------"); 

      this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
      this.listenThread.Start(); 
     } 

     private void ListenForClients() 
     { 
      this.tcpPrimaryListener.Start(); 

      while (true) 
      { 
       TcpClient client = this.tcpPrimaryListener.AcceptTcpClient(); 
       Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 
       clientThread.Start(client); 
      } 
     } 

     private void HandleClientComm(object client) 
     { 
      string noNodes = "Sorry all nodes are occupied."; 

      if (currentNode <= nodeCount) 
      { 
       Console.WriteLine("Client connected."); 

       TcpClient tcpClient = (TcpClient)client; 
       NetworkStream tcpClientStream = tcpClient.GetStream(); 

       TcpClient telnet = new TcpClient("10.24.9.11", 23); 
       //TcpClient telnet = new TcpClient("192.168.100.5" + currentNode, 23); 
       NetworkStream telnetStream = telnet.GetStream(); 

       currentNode++; 

       ByPass linkedSockets = new ByPass(tcpClientStream, telnetStream); 
      } 
      else 
      { 
       TcpClient tcpClient = (TcpClient)client; 
       NetworkStream tcpClientStream = tcpClient.GetStream(); 

       ASCIIEncoding encoder = new ASCIIEncoding(); 
       tcpClientStream.Write(Encoding.ASCII.GetBytes(noNodes), 0, noNodes.Length); 
      } 
     } 
    } 

    public class ByPass 
    { 
     public ByPass(Stream s1, Stream s2) 
     { 
      var cTokenSource = new CancellationTokenSource(); 
      var cToken = cTokenSource.Token; 
      Task.Factory.StartNew(() => Process(s1, s2, cToken, cTokenSource), cToken); 
      Task.Factory.StartNew(() => Process(s2, s1, cToken, cTokenSource), cToken); 
      cToken.Register(() => cancelNotification()); 
     } 

     public void Process(Stream s1, Stream s2, CancellationToken ct, CancellationTokenSource cTokenSource) 
     { 
      byte[] buf = new byte[0x10000]; 

      while (true) 
      { 
       if (ct.IsCancellationRequested) 
       { 
        break; 
       } 

       try 
       { 
        int len = s1.Read(buf, 0, buf.Length); 
        s2.Write(buf, 0, len); 
       } 
       catch 
       { 
        s1.Close(); s2.Close(); 
        cTokenSource.Cancel(); 
        break; 
       } 
      } 
     } 
    } 

    static void cancelNotification() 
    { 
     Console.WriteLine("Client disconnected."); 
     currentNode--; 
    } 
} 
} 
+0

之間傳遞數據是什麼你遇到的問題是什麼?如果我們不知道確切的問題,我們不能幫助... –

+0

對不起,更新了包含的問題。 – user1270029

回答

5

我想,你可以創建類似如下的一類,以兩個流

public class ByPass 
{ 
    public ByPass(Stream s1, Stream s2) 
    { 

     Task.Factory.StartNew(() => Process(s1, s2)); 
     Task.Factory.StartNew(() => Process(s2, s1)); 
    } 

    public void Process(Stream sIn, Stream sOut) 
    { 
     byte[] buf = new byte[0x10000]; 
     while (true) 
     { 
      int len = sIn.Read(buf, 0, buf.Length); 
      sOut.Write(buf, 0, len); 
     } 
    } 
} 
+0

謝謝,是的,它現在傳遞數據。在進行幾個屏幕的數據調試時,出現了''mscorlib.dll'中發生'System.OutOfMemoryException'類型的未處理異常。我會標記回答,因爲它確實解決了問題。 – user1270029

0

我沒有取得什麼變化,它完美的作品在我身邊

public class StreamTransmitter 
    { 
     static TaskCompletionSource<bool> ts; 

     public static async Task Start(Stream s1, Stream s2, CancellationToken token) 
     { 
      ts = new TaskCompletionSource<bool>(); 

      Process(s1, s2, token); 
      Process(s2, s1, token); 

      await ts.Task; 
     } 

     private static async Task Process(Stream sIn, Stream sOut, CancellationToken token) 
     { 
      byte[] buf = new byte[0x10000]; 
      int len = 0; 
      do 
      { 
       len = await sIn.ReadAsync(buf, 0, buf.Length, token); 
       await sOut.WriteAsync(buf, 0, len, token); 
      } 
      while (len > 0 && !token.IsCancellationRequested); 

      ts.SetResult(true); 
     } 
    }