2011-09-01 24 views
0

任何示例设计代码在C#或VB.NET?C#UDP代理/管

寻找在.NET

一个UDP管例如我下载 简单的UDP代理/管0.4.1 由Luigi奥列马

这是在C++ ..

它完美的作品。但是我想在.NET我自己的FPGA实现..所以我可以直接嗅探数据包。

+0

这可能有助于http://stackoverflow.com/questions/2069068/simple-udp-socket-tutorial-needed – kenny

回答

2

固定在这里是解决办法,如果有人想了解我是如何解决它。请注意,这可能是唯一的UDP代理上的所有谷歌,如果你偶然发现了这..这是在C#编码..很容易地移植到VB.NET与在线.NET转换器

要快乐此代码的工作;)

当然这不是有效的,因为它不使用活动..喜欢ReceiveAsync/EndReceive。

只有不使用Aysnchronize事件的垮台是你在工作代码下面看到..将不得不陷入无限循环..它会烧你的CPU周期..用Thread.Sleep (10)。(不要设置为高,否则你就必须UDP滞后)

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Net.Sockets; 
using System.Net; 

namespace UdpProxy 
{ 
    class Program 
    { 
     public static IPEndPoint m_listenEp = null; 
     public static EndPoint m_connectedClientEp = null; 
     public static IPEndPoint m_sendEp = null; 
     public static Socket m_UdpListenSocket = null; 
     public static Socket m_UdpSendSocket = null; 


     static void Main(string[] args) 
     { 

      // Creates Listener UDP Server 
      m_listenEp = new IPEndPoint(IPAddress.Any, 7900); 
      m_UdpListenSocket = new Socket(m_listenEp.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp); 
      m_UdpListenSocket.Bind(m_listenEp); 

      //Connect to zone IP EndPoint 
      m_sendEp = new System.Net.IPEndPoint(IPAddress.Parse("REMOTE_IP_GOES_HERE"), 7900); 
      m_connectedClientEp = new System.Net.IPEndPoint(IPAddress.Any, 7900); 

      byte[] data = new byte[1024]; 

      while (true) 
      { 
       if (m_UdpListenSocket.Available > 0) 
       { 

        int size = m_UdpListenSocket.ReceiveFrom(data, ref m_connectedClientEp); //client to listener 

        if (m_UdpSendSocket == null) 
        { 
         // Connect to UDP Game Server. 
         m_UdpSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
        } 

        m_UdpSendSocket.SendTo(data, size, SocketFlags.None, m_sendEp); //listener to server. 

       } 

       if (m_UdpSendSocket != null && m_UdpSendSocket.Available > 0) 
       { 
        int size = m_UdpSendSocket.Receive(data); //server to client. 

        m_UdpListenSocket.SendTo(data, size, SocketFlags.None, m_connectedClientEp); //listner 

       } 
      } 


      // Wait for any key to terminate application 
      Console.ReadKey(); 
     } 
    } 
} 

我总是回头看这个答案时,我开始一个新的UDP代理项目,并在上面的代码有某些问题它失去连接,(在无连接协议)UDP服务器雅我不知道是怎么回事了,但是我用的,而不是套接字UDPClient固定它

这里是 TCP或UDP重定向/ UDP代理/ UDP管道/ TCP代理/ TCP管道的不同变种


我创建UDP代理连接蹦床和许多不同的模式,他们似乎都用来连接松动标准的套接字类,但使用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