web-dev-qa-db-fra.com

C # UDP Socket client et serveur

Ma première question ici. Je suis novice dans ce type de programmation et je n’ai programmé que des sites Web et des formulaires .NET.

Maintenant, la société dans laquelle je travaille me demande de créer un composant ActiveX, qui écoute les messages UDP et les transforme en événements.

Les messages UDP sont envoyés depuis le système Avaya. On m'a donc dit que pour tester mon ActiveX, je devais au préalable créer une application qui n'envoyait que le protocole UDP (un seul bouton envoyant une chaîne UDP prédéfinie). Et ensuite, créez un connecteur d'écoute, application C # ordinaire, qui récupérera la chaîne UDP transmise à partir de l'application de test. Les deux applications fonctionneront sur le même ordinateur.

Plus tard, quand cela fonctionnera, je devrai faire de l'auditeur un composant ActiveX, mais avant tout.

J'ai besoin de savoir s'il existe de bons tutoriels à ce sujet et une idée sur la façon de commencer? Je suis désolé de mon ignorance, mais je suis vraiment nouveau dans ce domaine et je n’ai pas vraiment le temps de l’apprendre car cela doit être fait dans 2 semaines.

Merci d'avance.

edit: J'ai réussi à créer 2 applications de console simples et envoyais avec succès des messages UDP entre elles. L'expéditeur sera uniquement à des fins de test, et je dois maintenant reconfigurer mon destinataire pour qu'il reçoive le message UDP et le «traduise» en événements. Et enfin, en faire un contrôle ActiveX ...

9
Paul

Serveur simple et client:

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");
    }
}
33
lboshuizen

Serveur simple et client:

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);
    }
}
5
Bachor

Serveur

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

Et initialiser le fil

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

Client

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

Insérez-le dans le bouton de commande.

Source: http://technotif.com/creating-simple-udp-server-client-transfer-data-using-c-vb-net/

1
user3520827