Клиент и сервер сокета C# UDP

мой первый вопрос здесь. Я новичок в такого рода программировании, и я только запрограммировал веб-сайты и формы .NET.

теперь компания, в которой я работаю, просит меня сделать компонент ActiveX, который слушает сообщения UDP и превращает их в события.

UDP msgs отправляются из системы Avaya, поэтому мне сказали, что для тестирования моего ActiveX сначала мне нужно создать приложение, которое отправляет только UDP (только одну кнопку, которая отправляет предопределенную строку UDP). А затем создать прослушиватель сокет, обычное приложение c#, которое получит переданную строку UDP из приложения tests. Оба приложения будут работать на одном компьютере.

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

Мне нужно знать, есть ли хорошие учебники об этом, и любая идея о том, как начать? Я сожалею о своем невежестве, но я действительно Новичок в этом, и у меня действительно нет времени, чтобы узнать это, так как это должно быть сделано в 2 недели.

спасибо заранее.

edit: мне удалось создать 2 простых консольных приложения и успешно отправлять UDP-сообщения между ними. Отправитель будет только для тестирования, и теперь мне нужно повторно сделать мой приемник, чтобы получить сообщение UDP и "перевести" его на события. И, наконец, сделать его элементом управления ActiveX...

3 ответов


простой сервер и клиент:

public struct Received
{
    public IPEndPoint Sender;
    public string Message;
}

abstract class UdpBase
{
    protected UdpClient Client;

    protected UdpBase()
    {
        Client = new UdpClient();
    }

    public async Task<Received> Receive()
    {
        var result = await Client.ReceiveAsync();
        return new Received()
        {
            Message = Encoding.ASCII.GetString(result.Buffer, 0, result.Buffer.Length),
            Sender = result.RemoteEndPoint
        };
    }
}

//Server
class UdpListener : UdpBase
{
    private IPEndPoint _listenOn;

    public UdpListener() : this(new IPEndPoint(IPAddress.Any,32123))
    {
    }

    public UdpListener(IPEndPoint endpoint)
    {
        _listenOn = endpoint;
        Client = new UdpClient(_listenOn);
    }

    public void Reply(string message,IPEndPoint endpoint)
    {
        var datagram = Encoding.ASCII.GetBytes(message);
        Client.Send(datagram, datagram.Length,endpoint);
    }

}

//Client
class UdpUser : UdpBase
{
    private UdpUser(){}

    public static UdpUser ConnectTo(string hostname, int port)
    {
        var connection = new UdpUser();
        connection.Client.Connect(hostname, port);
        return connection;
    }

    public void Send(string message)
    {
        var datagram = Encoding.ASCII.GetBytes(message);
        Client.Send(datagram, datagram.Length);
    }

}

class Program 
{
    static void Main(string[] args)
    {
        //create a new server
        var server = new UdpListener();

        //start listening for messages and copy the messages back to the client
        Task.Factory.StartNew(async () => {
            while (true)
            {
                var received = await server.Receive();
                server.Reply("copy " + received.Message, received.Sender);
                if (received.Message == "quit")
                    break;
            }
        });

        //create a new client
        var client = UdpUser.ConnectTo("127.0.0.1", 32123);

        //wait for reply messages from server and send them to console 
        Task.Factory.StartNew(async () => {
            while (true)
            {
                try
                {
                    var received = await client.Receive();
                    Console.WriteLine(received.Message);
                    if (received.Message.Contains("quit"))
                        break;
                }
                catch (Exception ex)
                {
                    Debug.Write(ex);
                }
            }
        });

        //type ahead :-)
        string read;
        do
        {
            read = Console.ReadLine();
            client.Send(read);
        } while (read != "quit");
    }
}

простой сервер и клиент:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

class Program
{
    static void Main(string[] args)
    {
        // Create UDP client
        int receiverPort = 20000;
        UdpClient receiver = new UdpClient(receiverPort);

        // Display some information
        Console.WriteLine("Starting Upd receiving on port: " + receiverPort);
        Console.WriteLine("Press any key to quit.");
        Console.WriteLine("-------------------------------\n");

        // Start async receiving
        receiver.BeginReceive(DataReceived, receiver);

        // Send some test messages
        using (UdpClient sender1 = new UdpClient(19999))
            sender1.Send(Encoding.ASCII.GetBytes("Hi!"), 3, "localhost", receiverPort);
        using (UdpClient sender2 = new UdpClient(20001))
            sender2.Send(Encoding.ASCII.GetBytes("Hi!"), 3, "localhost", receiverPort);

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

    private static void DataReceived(IAsyncResult ar)
    {
        UdpClient c = (UdpClient)ar.AsyncState;
        IPEndPoint receivedIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
        Byte[] receivedBytes = c.EndReceive(ar, ref receivedIpEndPoint);

        // Convert data to ASCII and print in console
        string receivedText = ASCIIEncoding.ASCII.GetString(receivedBytes);
        Console.Write(receivedIpEndPoint + ": " + receivedText + Environment.NewLine);

        // Restart listening for udp data packages
        c.BeginReceive(DataReceived, ar.AsyncState);
    }
}

сервер

public void serverThread()
{
    UdpClient udpClient = new UdpClient(8080);
    while(true)
    {
        IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
        Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
        string returnData = Encoding.ASCII.GetString(receiveBytes);
        lbConnections.Items.Add(RemoteIpEndPoint.Address.ToString() 
                                + ":" +  returnData.ToString());
    }
}

и инициализировать поток

private void Form1_Load(object sender, System.EventArgs e)
{
    Thread thdUDPServer = new Thread(new ThreadStart(serverThread));
    thdUDPServer.Start();
}

клиент

private void button1_Click(object sender, System.EventArgs e)
{
    UdpClient udpClient = new UdpClient();
    udpClient.Connect(txtbHost.Text, 8080);
    Byte[] senddata = Encoding.ASCII.GetBytes("Hello World");
    udpClient.Send(senddata, senddata.Length);
}

вставьте его в команду button.

источник: http://technotif.com/creating-simple-udp-server-client-transfer-data-using-c-vb-net/