c# - 我是否很好地连接到 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);
解决方案
UDP 没有连接状态,当您调用 JoinMulticastGroup 时,套接字将 IGMP(Internet 组管理协议)数据包发送到请求多播组成员资格的服务。
如果客户端被组接受,您可以开始在套接字上接收数据
socket.BeginReceive(ReceiveCallback, null);
基本上没有办法知道服务器是否会向您发送消息,UDP 的重点是不保持连接。您可以创建一个方法来 ping(发送消息)服务器并强制它进行多播,这看起来就像您尝试对“您好,来自客户端”消息执行的操作
有关多播组的更多信息,请查看此链接
推荐阅读
- angular - 在 Angular 中弹出并从 PopUP 中获取价值
- javascript - 无法在 powershell 中复制 CryptoJS.enc.Hex.parse(hash)
- php - 如何在php中获取对象的值?
- javascript - 如何为覆盖在 3D 模型上的球体对象显示鼠标单击事件的弹出数据(使用 Autodesk forge)
- c++ - 运行时多态性 - 箭头运算符访问错误的成员?
- python - 我收到 FileNotFoundError:[Errno 2] 没有这样的文件或目录:'user.txt'。我怎么称呼它不同?
- typo3 - 将字段添加到 TYPO3 模板以获取全球站点信息?
- azure-devops - Azure 管道运行时评估的变量传递了一个参数
- javascript - 最简单的是在 javascript 中显示未定义的元素
- prometheus - 如何在 Prometheus 中使用时间单位创建警报?比如“最近 2 分钟平均响应时间超过 5 秒”