任何示例设计代码在C#或VB.NET?C#UDP代理/管
寻找在.NET
一个UDP管例如我下载 简单的UDP代理/管0.4.1 由Luigi奥列马
这是在C++ ..
它完美的作品。但是我想在.NET我自己的FPGA实现..所以我可以直接嗅探数据包。
任何示例设计代码在C#或VB.NET?C#UDP代理/管
寻找在.NET
一个UDP管例如我下载 简单的UDP代理/管0.4.1 由Luigi奥列马
这是在C++ ..
它完美的作品。但是我想在.NET我自己的FPGA实现..所以我可以直接嗅探数据包。
固定在这里是解决办法,如果有人想了解我是如何解决它。请注意,这可能是唯一的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
这可能有助于http://stackoverflow.com/questions/2069068/simple-udp-socket-tutorial-needed – kenny