2011-09-01 62 views
0

我得到這個錯誤..我知道IP地址是無效的!但它只是一個基於端口的服務器。UDP PROXY/PIPE,請求的地址在其上下文中無效

錯誤=

錯誤在runProxy @請求的地址不在其上下文中有效 0.0.0.0:7900

誰能告訴我我做錯了什麼?

Sub runProxy() 
    If serverUdpClient IsNot Nothing Then 
     serverUdpClient.Close() 
     serverUdpClient = Nothing 
    End If 
    If clientUdpClient IsNot Nothing Then 
     clientUdpClient.Close() 
     clientUdpClient = Nothing 
    End If 

    Try 
     'Listen for incoming udp connection request. 
     serverUdpClient = New UdpClient(New IPEndPoint(IPAddress.Any, Int32.Parse(Int(txtListeningPort.Text)))) 
     clientUdpClient = New UdpClient(txtIP.Text, Int32.Parse(Int(txtListeningPort.Text))) 

     WriteLog("Server started at: " + txtListeningPort.Text) 

     Dim data As Byte() = New Byte(1023) {} 
     Dim sender As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) 

     While True 
      Application.DoEvents() 
      If serverUdpClient.Available > 0 Then 
       data = serverUdpClient.Receive(sender) 

       'Connect to server. 
       If clientUdpClient Is Nothing Then 
        clientUdpClient = New UdpClient(txtIP.Text, Int32.Parse(Int(txtListeningPort.Text))) 
        clientUdpClient.Connect(txtIP.Text, Int32.Parse(Int(txtListeningPort.Text))) 
       End If 

       clientUdpClient.Send(data, data.Length) 
      End If 

      If clientUdpClient.Available > 0 Then 
       data = clientUdpClient.Receive(sender) 
       serverUdpClient.Connect(New IPEndPoint(IPAddress.Any, Int32.Parse(Int(txtListeningPort.Text)))) 
       serverUdpClient.Send(data, data.Length) 

      End If 

     End While 
    Catch ex As Exception 
     WriteLog("Errors at runProxy @ " + ex.Message) 
    End Try 
End Sub 

PS>我的客戶我連接到127.0.0.1 : 7900 ..

我希望它重新路由連接到txtIP.text : 7900txtListeningPort.Text

回答

0

這裏是一個工作 TCP或UDP重定向器/ UDP代理/ UDP管道/ TCP代理/ TCP管道


我創建了許多不同型號的UDP代理連接保安人員,他們都是eem使用標準Sockets類丟失連接,但使用UDPClient類時,此問題完全消失。

的UDP代理只有25行代碼,但在功耗和穩定性是關閉的圖表

下面的例子如何做到這一點的TCP和UDP

C#低於

代碼
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 
using System.Diagnostics; 
using System.Net; 
using System.Threading; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string Address= "*PUT IP ADDRESS HERE WHERE UDP SERVER IS*"; 
      int UDPPort = *PUT UDP SERVER PORT HERE*; 
      UdpRedirect _UdpRedirect = new UdpRedirect() { _address = Address, _Port = UDPPort}; 
      Thread _Thread = new Thread(_UdpRedirect.Connect); 
      _Thread.Name = "UDP"; 
      _Thread.Start(); 

      int TCPPort = *PUT TCP PORT HERE FOR TCP PROXY*;  
      TcpRedirect _TcpRedirect = new TcpRedirect(Address, TCPPort);    
     } 
    } 
    class UdpRedirect 
    { 
     public string _address; 
     public int _Port; 
     public UdpRedirect() 
     { 
     } 

     public void Connect() 
     { 
      UdpClient _UdpClient = new UdpClient(_Port); 
      int? LocalPort = null; 
      while (true) 
      { 
       IPEndPoint _IPEndPoint = null; 
       byte[] _bytes = _UdpClient.Receive(ref _IPEndPoint); 
       if (LocalPort == null) LocalPort = _IPEndPoint.Port; 
       bool Local = IPAddress.IsLoopback(_IPEndPoint.Address); 
       string AddressToSend = null; 
       int PortToSend = 0; 
       if (Local) 
       { 
        AddressToSend = _address; 
        PortToSend = _Port; 
       } 
       else 
       { 
        AddressToSend = "127.0.0.1"; 
        PortToSend = LocalPort.Value; 
       } 
       _UdpClient.Send(_bytes, _bytes.Length, AddressToSend, PortToSend); 
      } 
     } 
    } 
    class TcpRedirect 
    { 
     public TcpRedirect(string _address, int _Port) 
     { 

      TcpListener _TcpListener = new TcpListener(IPAddress.Any, _Port); 
      _TcpListener.Start(); 
      int i = 0; 
      while (true) 
      { 
       i++; 
       TcpClient _LocalSocket = _TcpListener.AcceptTcpClient(); 
       NetworkStream _NetworkStreamLocal = _LocalSocket.GetStream(); 

       TcpClient _RemoteSocket = new TcpClient(_address, _Port); 
       NetworkStream _NetworkStreamRemote = _RemoteSocket.GetStream(); 
       Console.WriteLine("\n<<<<<<<<<connected>>>>>>>>>>>>>"); 
       Client _RemoteClient = new Client("remote" + i) 
       { 
        _SendingNetworkStream = _NetworkStreamLocal, 
        _ListenNetworkStream = _NetworkStreamRemote, 
        _ListenSocket = _RemoteSocket 
       }; 
       Client _LocalClient = new Client("local" + i) 
       { 
        _SendingNetworkStream = _NetworkStreamRemote, 
        _ListenNetworkStream = _NetworkStreamLocal, 
        _ListenSocket = _LocalSocket 
       }; 
      } 
     } 
     public class Client 
     { 
      public TcpClient _ListenSocket; 
      public NetworkStream _SendingNetworkStream; 
      public NetworkStream _ListenNetworkStream; 
      Thread _Thread; 
      public Client(string Name) 
      { 
       _Thread = new Thread(new ThreadStart(ThreadStartHander)); 
       _Thread.Name = Name; 
       _Thread.Start(); 
      } 
      public void ThreadStartHander() 
      { 
       Byte[] data = new byte[99999]; 
       while (true) 
       { 
        if (_ListenSocket.Available > 0) 
        { 
         int _bytesReaded = _ListenNetworkStream.Read(data, 0, _ListenSocket.Available); 
         _SendingNetworkStream.Write(data, 0, _bytesReaded); 
         Console.WriteLine("(((((((" + _bytesReaded + "))))))))))" + _Thread.Name + "\n" + ASCIIEncoding.ASCII.GetString(data, 0, _bytesReaded).Replace((char)7, '?')); 
        } 
        Thread.Sleep(10); 
       } 
      } 

     } 
    } 
} 

VB.NET下面的代碼

Imports System.Collections.Generic 
Imports System.Linq 
Imports System.Text 
Imports System.Net.Sockets 
Imports System.Diagnostics 
Imports System.Net 
Imports System.Threading 

Namespace ConsoleApplication1 
    Class Program 
     Private Shared Sub Main(args As String()) 
      Dim Address As String = "*PUT IP ADDRESS HERE WHERE UDP SERVER IS*" 
      Dim UDPPort As Integer = *PUT UDP SERVER PORT HERE* 
      Dim _UdpRedirect As New UdpRedirect() With { _ 
       Key ._address = Address, _ 
       Key ._Port = UDPPort _ 
      } 
      Dim _Thread As New Thread(AddressOf _UdpRedirect.Connect) 
      _Thread.Name = "UDP" 
      _Thread.Start() 

      Dim TCPPort As Integer = *PUT TCP SERVER PORT HERE* 
      Dim _TcpRedirect As New TcpRedirect(Address, TCPPort) 
     End Sub 
    End Class 
    Class UdpRedirect 
     Public _address As String 
     Public _Port As Integer 
     Public Sub New() 
     End Sub 

     Public Sub Connect() 
      Dim _UdpClient As New UdpClient(_Port) 
      Dim LocalPort As System.Nullable(Of Integer) = Nothing 
      While True 
       Dim _IPEndPoint As IPEndPoint = Nothing 
       Dim _bytes As Byte() = _UdpClient.Receive(_IPEndPoint) 
       If LocalPort Is Nothing Then 
        LocalPort = _IPEndPoint.Port 
       End If 
       Dim Local As Boolean = IPAddress.IsLoopback(_IPEndPoint.Address) 
       Dim AddressToSend As String = Nothing 
       Dim PortToSend As Integer = 0 
       If Local Then 
        AddressToSend = _address 
        PortToSend = _Port 
       Else 
        AddressToSend = "127.0.0.1" 
        PortToSend = LocalPort.Value 
       End If 
       _UdpClient.Send(_bytes, _bytes.Length, AddressToSend, PortToSend) 
      End While 
     End Sub 
    End Class 
    Class TcpRedirect 
     Public Sub New(_address As String, _Port As Integer) 

      Dim _TcpListener As New TcpListener(IPAddress.Any, _Port) 
      _TcpListener.Start() 
      Dim i As Integer = 0 
      While True 
       i += 1 
       Dim _LocalSocket As TcpClient = _TcpListener.AcceptTcpClient() 
       Dim _NetworkStreamLocal As NetworkStream = _LocalSocket.GetStream() 

       Dim _RemoteSocket As New TcpClient(_address, _Port) 
       Dim _NetworkStreamRemote As NetworkStream = _RemoteSocket.GetStream() 
       Console.WriteLine(vbLf & "<<<<<<<<<connected>>>>>>>>>>>>>") 
       Dim _RemoteClient As New Client("remote" + i) With { _ 
        Key ._SendingNetworkStream = _NetworkStreamLocal, _ 
        Key ._ListenNetworkStream = _NetworkStreamRemote, _ 
        Key ._ListenSocket = _RemoteSocket _ 
       } 
       Dim _LocalClient As New Client("local" + i) With { _ 
        Key ._SendingNetworkStream = _NetworkStreamRemote, _ 
        Key ._ListenNetworkStream = _NetworkStreamLocal, _ 
        Key ._ListenSocket = _LocalSocket _ 
       } 
      End While 
     End Sub 
     Public Class Client 
      Public _ListenSocket As TcpClient 
      Public _SendingNetworkStream As NetworkStream 
      Public _ListenNetworkStream As NetworkStream 
      Private _Thread As Thread 
      Public Sub New(Name As String) 
       _Thread = New Thread(New ThreadStart(AddressOf ThreadStartHander)) 
       _Thread.Name = Name 
       _Thread.Start() 
      End Sub 
      Public Sub ThreadStartHander() 
       Dim data As [Byte]() = New Byte(99998) {} 
       While True 
        If _ListenSocket.Available > 0 Then 
         Dim _bytesReaded As Integer = _ListenNetworkStream.Read(data, 0, _ListenSocket.Available) 
         _SendingNetworkStream.Write(data, 0, _bytesReaded) 
         Console.WriteLine("(((((((" + _bytesReaded + "))))))))))" + _Thread.Name + vbLf + ASCIIEncoding.ASCII.GetString(data, 0, _bytesReaded).Replace(CChar(7), "?"C)) 
        End If 
        Thread.Sleep(10) 
       End While 
      End Sub 

     End Class 
    End Class 
End Namespace 
相關問題