首页 > 解决方案 > 我是否很好地连接到 UDP 多播?C#

问题描述

我有这个代码,但我不知道我是否连接良好或加入了多播组。我可以通过普通IP“ip”发送和接收消息。但我不知道我是否应该做更多的事情来通过多播接收消息。我有这个代码:

    public void UDPConnect()
    {
        socket = new UdpClient(25504); 
        try
        {
            endPoint = new IPEndPoint(IPAddress.Parse(ip), 2600);
           
            socket.JoinMulticastGroup(IPAddress.Parse(multicastIP));
            socket.Connect(endPoint); 
            
            byte[] sendBytes = Encoding.ASCII.GetBytes("Hello, from the client");
            socket.Send(sendBytes, sendBytes.Length);

            ConnectToServer();
        }
        catch (Exception e)
        {
            print("Exception thrown " + e.Message);
        }
    }

    public void ConnectToServer()
    {
        InitializeClientData();

        isConnected = true;
        StartCoroutine(ClientSend.VisualStartupCor()); 

        socket.BeginReceive(ReceiveCallback, null);
    }

    public void ReceiveCallback(IAsyncResult _result)
    {
        try
        {
            byte[] _data = socket.EndReceive(_result, ref endPoint);
            socket.BeginReceive(ReceiveCallback, null);
           
            if (_data.Length < 4)
            {
                Instance.Disconnect();
                return;
            }

            HandleData(_data);
        }
        catch
        {
            Disconnect();
        }
    }

这是我的服务器代码,太简单了。我只是想测试我是否可以为客户发送和接收。如您所见,我已将我使用的多播 IP (231.1.1.10) 放入 Send 方法中。当我从客户端发送消息时,该服务器通过向客户端发送相同的消息来回答。我的客户端在 Unity 中检测到此消息。表示组播连接成功?

var udp = require('dgram');

// --------------------creating a udp server --------------------

// creating a udp server
var server = udp.createSocket('udp4');

// emits when any error occurs
server.on('error',function(error){
console.log('Error: ' + error);
server.close();
});

// emits on new datagram msg
server.on('message',function(msg,info){
console.log('Data received from client : ' + msg.toString());
console.log('Received %d bytes from %s:%d\n',msg.length, info.address, info.port);

//sending msg

server.send(msg,info.port,'231.1.1.10',function(error){
if(error){
client.close();
}else{
console.log('Data sent !!!');
}

});
});

//emits when socket is ready and listening for datagram msgs
server.on('listening',function(){
var address = server.address();
var port = address.port;
var family = address.family;
var ipaddr = '192.XXX.X.XX';
console.log('Server is listening at port' + port);
console.log('Server ip :' + ipaddr);
console.log('Server is IP4/IP6 : ' + family);
console.log(address);
});

//emits after the socket is closed using socket.close();
server.on('close',function(){
console.log('Socket is closed !');
});

server.bind(2600);

标签: c#udpmulticast

解决方案


UDP 没有连接状态,当您调用 JoinMulticastGroup 时,套接字将 IGMP(Internet 组管理协议)数据包发送到请求多播组成员资格的服务。

如果客户端被组接受,您可以开始在套接字上接收数据

socket.BeginReceive(ReceiveCallback, null);

基本上没有办法知道服务器是否会向您发送消息,UDP 的重点是不保持连接。您可以创建一个方法来 ping(发送消息)服务器并强制它进行多播,这看起来就像您尝试对“您好,来自客户端”消息执行的操作

有关多播组的更多信息,请查看此链接


推荐阅读