C#UDP代理/管道 [英] C# UDP Proxy / Pipe

查看:60
本文介绍了C#UDP代理/管道的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有C#或VB.NET中的示例设计代码?

在.NET中寻找UDP管道示例

我下载了简单的UDP代理/管道0.4.1Luigi Auriemma

使用C ++.

它工作正常..但是我想在.NET中实现自己的实现,所以我可以直接嗅探数据包.

解决方案

如果有任何人想了解我如何解决此问题,这里提供解决方案..请注意,如果您偶然发现了这可能是整个Google上唯一的UDP代理基于此..用C#..编码.可以通过在线.NET转换器轻松移植到VB.NET

很高兴这段代码有效;)

确保它效率不高,因为它不使用事件.例如ReceiveAsync/EndReceive.

不使用Aysnchronize事件的唯一缺点是您将看到下面的工作代码..它们必须陷入无限循环..这会消耗您的CPU周期..很容易用Thread.Sleep(10)..(请不​​要设置为高,否则会出现udp滞后)

 使用系统;使用System.Collections.Generic;使用System.Text;使用System.Net.Sockets;使用System.Net;命名空间UdpProxy{班级计划{公共静态IPEndPoint m_listenEp = null;公共静态端点m_connectedClientEp = null;公共静态IPEndPoint m_sendEp = null;公共静态套接字m_UdpListenSocket = null;公共静态套接字m_UdpSendSocket = null;静态void Main(string [] args){//创建侦听器UDP服务器m_listenEp =新的IPEndPoint(IPAddress.Any,7900);m_UdpListenSocket =新的Socket(m_listenEp.Address.AddressFamily,SocketType.Dgram,ProtocolType.Udp);m_UdpListenSocket.Bind(m_listenEp);//连接到区域IP端点m_sendEp =新的System.Net.IPEndPoint(IPAddress.Parse("REMOTE_IP_GOES_HERE"),7900);m_connectedClientEp =新的System.Net.IPEndPoint(IPAddress.Any,7900);字节[]数据=新字节[1024];一会儿(true){如果(m_UdpListenSocket.Available> 0){int size = m_UdpListenSocket.ReceiveFrom(data,ref m_connectedClientEp);//客户端到侦听器如果(m_UdpSendSocket == null){//连接到UDP游戏服务器.m_UdpSendSocket =新的Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);}m_UdpSendSocket.SendTo(data,size,SocketFlags.None,m_sendEp);//监听服务器.}如果(m_UdpSendSocket!= null&& m_UdpSendSocket.Available> 0){int size = m_UdpSendSocket.Receive(data);//服务器到客户端.m_UdpListenSocket.SendTo(data,size,SocketFlags.None,m_connectedClientEp);//侦听器}}//等待任何键终止应用程序Console.ReadKey();}}} 

当我开始一个新的UDP代理项目时,我总是回头看这个答案,上面的代码在某些UDP服务器上丢失连接(基于无连接协议)时出现问题,我不知道它是如何发生的但是我使用UDPClient而不是套接字来解决它

这是TCP或UDP重定向器/UDP代理/UDP管道/TCP代理/TCP管道


我创建了许多不同模型的UDP代理连接启动器,使用标准的Sockets类它们似乎都失去了连接,但是使用UDPClient类,这个问题就完全消失了.

UDP代理只有25行代码,但是功能和稳定性不在图表之列

下面是在TCP和UDP中如何实现的示例

C#下面的代码

 使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Text;使用System.Net.Sockets;使用System.Diagnostics;使用System.Net;使用System.Threading;命名空间ConsoleApplication1{班级计划{静态void Main(string [] args){字符串地址="*在此处放置UDP服务器的IP地址";int UDPPort = *在此处放置UDP服务器端口*;UdpRedirect _UdpRedirect =新的UdpRedirect(){_address =地址,_Port = UDPPort};线程_Thread =新线程(_UdpRedirect.Connect);_Thread.Name ="UDP";_Thread.Start();int TCPPort = *在此处为TCP PROXY输入TCP端口*;TcpRedirect _TcpRedirect =新的TcpRedirect(地址,TCPPort);}}UdpRedirect类{公共字符串_address;public int _Port;公共UdpRedirect(){}公共无效的Connect(){UdpClient _UdpClient =新的UdpClient(_Port);诠释?LocalPort = null;一会儿(true){IPEndPoint _IPEndPoint = null;byte [] _bytes = _UdpClient.Receive(ref _IPEndPoint);如果(LocalPort == null)LocalPort = _IPEndPoint.Port;bool Local = IPAddress.IsLoopback(_IPEndPoint.Address);字符串AddressToSend = null;int PortToSend = 0;如果(本地){AddressToSend = _address;PortToSend = _Port;}别的{AddressToSend ="127.0.0.1";PortToSend = LocalPort.Value;}_UdpClient.Send(_bytes,_bytes.Length,AddressToSend,PortToSend);}}}TcpRedirect类{公共TcpRedirect(字符串_address,int _Port){TcpListener _TcpListener =新的TcpListener(IPAddress.Any,_Port);_TcpListener.Start();int i = 0;一会儿(true){i ++;TcpClient _LocalSocket = _TcpListener.AcceptTcpClient();NetworkStream _NetworkStreamLocal = _LocalSocket.GetStream();TcpClient _RemoteSocket =新的TcpClient(_address,_Port);NetworkStream _NetworkStreamRemote = _RemoteSocket.GetStream();Console.WriteLine("\ n<<<<<>>>>>> ;;");客户端_RemoteClient =新客户端(远程" + i){_SendingNetworkStream = _NetworkStreamLocal,_ListenNetworkStream = _NetworkStreamRemote,_ListenSocket = _RemoteSocket};客户端_LocalClient =新客户端(本地" + i){_SendingNetworkStream = _NetworkStreamRemote,_ListenNetworkStream = _NetworkStreamLocal,_ListenSocket = _LocalSocket};}}公共类客户{公共TcpClient _ListenSocket;public NetworkStream _SendingNetworkStream;public NetworkStream _ListenNetworkStream;线程_Thread;公共客户端(字符串名称){_Thread =新线程(新ThreadStart(ThreadStartHander));_Thread.Name =名称;_Thread.Start();}公共无效ThreadStartHander(){Byte [] data = new byte [99999];一会儿(true){如果(_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 下面的代码

 导入System.Collections.Generic导入System.Linq导入System.Text导入System.Net.Sockets导入System.Diagnostics导入System.Net导入System.Threading命名空间ConsoleApplication1班级计划私有共享子主目录(args作为String())字符串形式的Dim地址="*在此处放置UDP服务器的情况下放置IP地址*"Dim UDPPort As Integer = *在此处放置UDP服务器端口*用{_将Dim _UdpRedirect设置为新的UdpRedirect()密钥._address =地址_密钥._Port = UDPPort _}昏暗_Thread作为新线程(AddressOf _UdpRedirect.Connect)_Thread.Name ="UDP"_Thread.Start()昏暗的TCPPort为整数= *在此处放置TCP服务器端口*Dim _TcpRedirect为新的TcpRedirect(地址,TCPPort)结束子末级类UdpRedirect公用_address作为字符串Public _Port As Integer公开子New()结束子公共子连接()昏暗_UdpClient作为新的UdpClient(_Port)Dim LocalPort As System.Nullable(Integer)=否虽然真实Dim _IPEndPoint为IPEndPoint = NothingDim _bytes为Byte()= _UdpClient.Receive(_IPEndPoint)如果LocalPort什么都没有,那么LocalPort = _IPEndPoint.Port万一Dim Local As布尔值= IPAddress.IsLoopback(_IPEndPoint.Address)昏暗的AddressToSend作为字符串=什么都没有昏暗的PortToSend作为整数= 0如果是本地则AddressToSend = _addressPortToSend = _Port别的AddressToSend ="127.0.0.1"PortToSend = LocalPort.Value万一_UdpClient.Send(_bytes,_bytes.Length,AddressToSend,PortToSend)结束时间结束子末级类TcpRedirect新建公共子项(_address作为字符串,_Port作为整数)昏暗的_TcpListener作为新的TcpListener(IPAddress.Any,_Port)_TcpListener.Start()Dim i As Integer = 0虽然真实我+ = 1Dim _LocalSocket为TcpClient = _TcpListener.AcceptTcpClient()Dim _NetworkStreamLocal为NetworkStream = _LocalSocket.GetStream()昏暗_RemoteSocket作为新的TcpClient(_address,_Port)Dim _NetworkStreamRemote为NetworkStream = _RemoteSocket.GetStream()Console.WriteLine(vbLf&<<<<<<>>>>>>>>)昏暗的_RemoteClient作为新客户端(远程" + i),带有{_密钥._SendingNetworkStream = _NetworkStreamLocal,_密钥._ListenNetworkStream = _NetworkStreamRemote,_键._ListenSocket = _RemoteSocket _}使用{_将Dim _LocalClient用作新客户端(本地" + i)密钥._SendingNetworkStream = _NetworkStreamRemote,_密钥._ListenNetworkStream = _NetworkStreamLocal,_键._ListenSocket = _LocalSocket _}结束时间结束子公共类客户公共_ListenSocket作为TcpClientPublic _SendingNetworkStream作为NetworkStream公共_ListenNetworkStream作为NetworkStream私有_Thread作为线程Public Sub New(名称为字符串)_Thread =新线程(新ThreadStart(AddressOf ThreadStartHander))_Thread.Name =名称_Thread.Start()结束子公共子ThreadStartHander()昏暗的数据为[Byte]()= New Byte(99998){}虽然真实如果_ListenSocket.Available>0然后Dim _bytesReaded为整数= _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))万一线程睡眠(10)结束时间结束子末级末级结束命名空间 

Any example design code in C# or VB.NET ?

Looking for a UDP Pipe example in .NET

I downloaded Simple UDP proxy/pipe 0.4.1 by Luigi Auriemma

Which is in C++..

it works perfectly.. but I want to make my own implemention in .NET.. so I can sniff packets directly.

解决方案

Fixed it here is the solution if anyone wants to learn how I fixed it.. Please note this is probably the only UDP Proxy on all of google if you stumbled upon this.. that is coded in C#.. easily ported to VB.NET with online .NET converter

Be happy this code works ;)

Sure it's not efficient because it doesn't use events.. like ReceiveAsync/EndReceive.

Only downfall to not using Aysnchronize events.. is that you see below the working code.. will have to be stuck in a infinite loop.. and it will burn your CPU cycles.. easily fixed with a Thread.Sleep(10).. (don't set to high or you will have udp lag)

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();
        }
    }
}

I always look back at this answer when I start a new UDP Proxy project and the above code has issues with certain UDP Servers where it loses connections, (on a connectless protocol) ya I have no idea how it happens but I fixed it with using UDPClient instead of Sockets

Here is a different variant of the TCP or UDP Redirector / UDP Proxy / UDP Pipe / TCP Proxy / TCP Pipe


I created many different models of UDP Proxy connection bouncers and they all seem to loose connection using the standard Sockets class, but using UDPClient classes this problem completely went away.

The UDP Proxy is only 25 lines of code but the power and stability is off the charts

Below is examples how to do it in both TCP and UDP

C# Code below

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 Code Below

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

这篇关于C#UDP代理/管道的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆