Базовый UDP C # или VB.NET Pipe? - PullRequest
       5

Базовый UDP C # или VB.NET Pipe?

0 голосов
/ 31 августа 2011

Ищем базовый канал UDP или перенаправитель. Должен, конечно, быть в состоянии увидеть оба

клиент 2 сервер и сервер 2 данные клиента.

Вот то, что я пытался, но это не удалось, потому что я не знаю, когда звонить, который получает ..

Скажи, что я звоню

  data = serverUdpClient.Receive(sender)

тогда я должен перенаправить это, поэтому я называю это

  clientUdpClient.Send(data, data.Length)

Теперь следует строка после, которая является правильной в TCP Pipe.

  data = clientUdpClient.Receive(sender)..

Но я должен .. позвонить еще раз ..

  data = serverUdpClient.Receive(sender)
  clientUdpClient.Send(data, data.Length)

прежде чем я смогу использовать

  data = clientUdpClient.Receive(sender)..

Практически весь поток кода трахается ... потому что сокет блокируется. Когда я начал работать над UDP ... все примеры говорят о том, что держитесь подальше от неблокирования, так как это слишком сложно для того, чтобы новичок пытался работать с сетевыми сокетами ... Я считаю это утверждение неправильным ... наоборот!.

Public serverUdpClient As System.Net.Sockets.UdpClient
Public clientUdpClient As System.Net.Sockets.UdpClient

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))))

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

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

        While True
            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)
            data = clientUdpClient.Receive(sender)

            serverUdpClient.Send(data, data.Length)
        End While
    Catch ex As Exception
        WriteLog("Errors at runProxy @ " + ex.Message)
    End Try
End Sub

Также попробовал это .. не работает должным образом.

        While True
            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.Send(data, data.Length)

            End If

        End While

1 Ответ

0 голосов
/ 02 сентября 2011

Исправлено все, что мне нужно было сделать, это преобразовать IPEndPoint моего отправителя в подключенный экземпляр ..

Вот один без Async .., который я сделал, и он работает .. только UDP Proxy на всех Google / SO, закодированных в C #.

Исправлено, вот решение, если кто-то захочет узнать, как я это исправил .. Обратите внимание, что это, вероятно, единственный прокси-сервер UDP на всех страницах Google, если вы наткнулись на это .. который написан на C # .. легко переносится на VB.NET с онлайн конвертером .NET

Будь счастлив, этот код работает;)

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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...