Sto usando mono per creare un programma C# che deve inviare e ricevere usando UDP. Attualmente la mia implementazione funziona come previsto su Windows ma ho problemi a far funzionare la comunicazione con i miei sistemi Ubuntu o Fedora.UDP in C# funziona su Windows ma non su Linux
Windows può trasmettere e ricevere i propri datagrammi.
Ubuntu può trasmettere e ricevere i propri datagrammi. Le trasmissioni sono ricevute da Windows ma non vede i datagrammi trasmessi da Windows.
Fedora può trasmettere ma non riceve datagrammi da nessuna parte (nemmeno da solo). Le trasmissioni sono ricevute da Windows.
Quando i datagrammi non riescono a raggiungere una delle macchine linux, la funzione "ricezione" non viene mai attivata.
Questo è quello che ho finora:
int _port = 4568;
var server = new UdpClient(_port);
var send_UDP = new UdpClient();
La ricezione metodo utilizza le chiamate asincrone della classe 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 {}
}
E il metodo di invio;
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);
}
Dopo alcuni test con Fedora, sembra essere un problema con l'uso di 255.255.255.255 per trasmettere. C'è un altro modo per farlo?
si ottiene errori? Hai provato a rimuovere il 'try-catch' per vedere se ci sono errori di runtime? Hai impostato un punto di interruzione in 'receive' per vedere se viene chiamato? –
Il 'try-catch' è solo per ricevere da più utenti - nel mio codice di debug l'eccezione viene stampata sulla console. Proverò a eseguire il debug del metodo di ricezione sugli altri sistemi (non era qualcosa che avevo pensato di provare). –
Il codice di ricezione non viene mai attivato su Fedora. Questo sembra essere indipendente da dove ha origine il datagramma (ho provato a inviare dal computer locale e da una finestra di Windows). –