C# UDP Socket 客户端和服务器

标签 c# sockets udp activex

我的第一个问题。我是这种编程的新手,我只编写过 .NET 网站和表单。

现在,我工作的公司要我制作一个 ActiveX 组件,用于监听 UDP 消息,并将它们转化为事件。

UDP 消息是从 Avaya 系统发送的,所以我被告知要测试我的 ActiveX,首先我需要创建一个应用程序,它只发送 UDP(只有一个按钮发送预定义的 UDP 字符串)。然后创建监听器套接字,普通的 C# 应用程序,它将从测试应用程序获取那些传输的 UDP 字符串。这两个应用程序将在同一台机器上运行。

稍后,当我开始工作时,我需要让监听器成为一个 ActiveX 组件,但首先要做的是。

我想知道是否有关于此的任何好的教程,以及关于如何开始的任何想法?很抱歉我的无知,但我在这方面真的很陌生,我真的没有时间学习它,因为它必须在 2 周内完成。

提前致谢。

编辑:我设法创建了 2 个简单的控制台应用程序,并成功地在它们之间发送了 UDP 消息。发送方将仅用于测试,现在我需要重新制作我的接收方以获取 UDP 消息并将其“翻译”为事件。最后,使其成为 ActiveX 控件...

最佳答案

简单的服务器和客户端:

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

关于C# UDP Socket 客户端和服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786668/

相关文章:

c# - 复制文件时如何防止此 System.IO.IOException?

c++ - 使用 WinSock2 开发,CreateThread() 函数出错

c++ - 收到信号 : SIGPIPE (Broken pipe)

c# - 在没有用户包装程序的情况下从客户端应用程序执行系统存储过程 (sys.sp_helptext)

c# - 具有 Unity IoC 的 MVC 5/.Net 框架 - 注册 ILogger

windows - npm 安装 socket.io 失败

c# - WAN 上的 TCP/UDP 套接字服务器

c++ - 如何在 Windows 上用 C++ 以指定速率发送 UDP 数据包?

ffmpeg - UDP Receiver 需要在 udp sender 之前启动

c# - 从窗口句柄获取真实文本