Я использую mono для создания программы на С#, которую нужно отправлять и получать с помощью UDP. В настоящее время моя реализация работает как ожидается в Windows, но у меня возникают проблемы с получением связи для работы с моими системами Ubuntu или Fedora.
Windows может транслировать и получать собственные дейтаграммы.
Ubuntu может транслировать и получать собственные дейтаграммы. Это широковещательные передачи принимаются Windows, но он не видит датаграммы, транслируемые Windows.
Fedora может транслировать, но не получает датаграммы из любого места (даже не самого себя). Это широковещательные передачи принимаются Windows.
Когда датаграммы не достигают ни одной из Linux-машин, функция "получать" никогда не запускается.
Это то, что у меня есть до сих пор:
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 для трансляции. Есть ли другой способ сделать это?