c# - C# - 无法接收 UDP 多播帧
问题描述
我使用旧问题(UDP 多播。C#)中的示例来实现 MC 数据包的简单接收器/发送器。
收件人
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace multiCastRecv
{
class recv
{
recv(string mcastGroup, string port)
{
Console.WriteLine("Receive MC from group: {0}, Port: {1}", mcastGroup, port);
// Create new socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// Create IP endpoint
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse(port));
// Bind endpoint to the socket
s.Bind(ipep);
// Multicast IP-address
IPAddress ip = IPAddress.Parse(mcastGroup);
// Add socket to the multicast group
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, IPAddress.Any));
// Receive messages
while (true)
{
byte[] data = new byte[1024];
Console.WriteLine("Waiting....");
int len = s.Receive(data);
Console.WriteLine("Rcv {0} bytes", len);
string str = System.Text.Encoding.ASCII.GetString(data, 0, len);
Console.WriteLine(str.Trim());
}
}
public static void Main(string[] args)
{
new recv("224.168.55.25", "4567");
}
}
}
发射器:
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace multiCastSend
{
class send
{
send(string mcastGroup, string port, string ttl, string rep)
{
try
{
// Create socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// Multicast IP-address
IPAddress ip = IPAddress.Parse(mcastGroup);
// Join multicast group
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip));
// TTL
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, int.Parse(ttl));
// Create an endpoint
IPEndPoint ipep = new IPEndPoint(ip, int.Parse(port));
// Connect to the endpoint
s.Connect(ipep);
// Scan message
while (true)
{
byte[] b = new byte[10];
for (int x = 0; x < b.Length; x++) b[x] = (byte)(x + 65);
for (int x = 0; x < int.Parse(rep); x++)
{
Console.WriteLine("Sending ABCDEFGHIJ...");
s.Send(b, b.Length, SocketFlags.None);
}
Thread.Sleep(1000); // 1000 milliseconds i.e 1sec
}
}
catch (System.Exception e) { Console.Error.WriteLine(e.Message); }
}
static void Main(string[] args)
{
new send("224.168.55.25", "4567", "1", "2");
}
}
}
台式机和笔记本电脑都连接到同一个简单的 HUB。通过在接收器平台上运行 Wireshark,我可以正确看到 MC 数据包(见下文),但程序没有接收到:
帧 31355:在线 60 字节(480 位),在接口 0 Ethernet II 上捕获 60 字节(480 位),Src:Flextron_60:22:1f (00:21:cc:60:22:1f),Dst:IPv4mcast_28: 37:19 (01:00:5e:28:37:19) Internet 协议版本 4,Src:10.13.2.165,Dst:224.168.55.25 用户数据报协议,Src 端口:56556,Dst 端口:4567 数据(10 字节)数据:4142434445464748494a【长度:10】
当我在同一台机器上运行接收器和发射器时,它可以工作。
有人知道吗?
解决方案
推荐阅读
- c++ - 如何避免这个讨厌的概念陷阱(取决于顺序)
- string - XSL 循环通过故障块并将值附加到字符串而不使用模板
- python - 如何使用包含在一行中所有括号内的值创建一个新列?
- c++ - Direct2D 自定义效果 RegisterEffectFromString 不起作用
- swift - 如何在 for loop Swift 中发送响应 POST urlsession 任务?
- node.js - AWS Lambda 层中的 AccessDenied 可执行文件 - FFMPEG
- c# - 当代码在运行时更新时,将 Observable 集合绑定到组合框有效。但是在再次构建解决方案后它不起作用
- reactjs - React-rainbow 组件颜色主题
- bash - Bash - 如何将行转换为单行引用值
- reactjs - 用 useCallback 记忆一个切换函数有意义吗?