我使用mono来构建需要使用UDP进行发送和接收的C#程序。目前我的实现在Windows上按预期工作,但是我的通信与我的Ubuntu或Fedora系统一起工作时遇到问题。C#中的UDP在Windows上工作,但不在Linux上工作
Windows可以广播和接收它自己的数据报。
Ubuntu可以广播和接收它自己的数据报。它的广播被Windows收到,但是它没有看到由Windows广播的数据报。
Fedora可以广播,但不接收来自任何地方(甚至本身)的数据报。它的广播是由Windows收到的。
当数据报无法到达任何一台linux机器时,'receive'函数永远不会被触发。
这是我到目前为止有:
int _port = 4568;
var server = new UdpClient(_port);
var send_UDP = new UdpClient();
接收方法使用UDPClient的异步调用;
private static void receive()
{
server.BeginReceive(new AsyncCallback(receive), null);
}
private static void receive(IAsyncResult o)
{
try
{
// I'm told that port = 0 should receive from any port.
var sender = new IPEndPoint(IPAddress.Any, 0);
var data = server.EndReceive(o, ref sender);
receive();
var str = new string(Encoding.ASCII.GetChars(data));
postmessage(sender.Address.ToString() + ":" + sender.Port.ToString() + " > " + str);
}
catch {}
}
并发送方法;
public static void send(string message)
{
var target = new IPEndPoint(IPAddress.Parse("255.255.255.255"), _port);
byte[] data = Encoding.ASCII.GetBytes(message);
send_UDP.Send(data, data.Length, target);
}
对Fedora进行了一些测试后,似乎是使用255.255.255.255进行广播的问题。有没有其他方法可以做到这一点?
你得到任何错误?你有没有尝试删除'try-catch'来查看是否有任何运行时错误?你有没有在'receive'中设置一个断点来查看它是否被调用? –
'try-catch'仅用于从多个用户接收 - 在我的调试代码中,异常被打印到控制台。 我会尝试调试其他系统上的接收方法(这不是我曾经想过的尝试)。 –
接收代码永远不会在Fedora上触发。这似乎是无论数据报发源在哪里(我尝试从本地机器和Windows框发送)。 –