Korrekte Verwendung von DatagramSocket UDP
Habe ich den folgenden code (Ausschnitte unten) in meine Basis-Klasse für den Umgang mit einem UDP-socket. Ich bin das hinzufügen der Unterstützung für WinRT (gesteuert durch das #define für WINRT). Ich habe alles für .Net, aber etwas ist schief mit meinem WinRT Umsetzung. Wenn ich die Daten senden, nicht empfangen, die auf der server-Seite. Irgendeine Idee was schief läuft? Ich sehe keine Fehler auf der client-Seite, einfach nichts zeigt, bis auf dem server. Ich habe erfolgreich bekommen meine TCP-socket-Klasse zu arbeiten, mit dem data-Writer in einer ähnlichen Weise.
public UdpSocketClient(IPEndPoint remoteEndPoint, int localPort)
{
this.remoteEndPoint = remoteEndPoint;
#if WINRT
this.socket = new DatagramSocket();
this.socket.MessageReceived += ReceiveCallback;
//Bind to any port
Logger.Debug("{0}: UdpSocketClient created. Binding to port {1}.", this, (localPort == 0) ? "[any]" : localPort.ToString());
IAsyncAction bindAction = this.socket.BindEndpointAsync(new HostName("localhost"), localPort == 0 ? "0" : localPort.ToString());
bindAction.AsTask().Wait();
Logger.Trace("{0}: Bind Complete to port {1}", this, this.socket.Information.LocalServiceName);
//Get IOutputStream
Logger.Trace("{0}: Getting output stream to {1}.", this, remoteEndPoint);
IAsyncOperation<IOutputStream> asyncOutput = this.socket.GetOutputStreamAsync(remoteEndPoint.address, remoteEndPoint.port.ToString());
asyncOutput.AsTask().Wait();
Logger.Trace("{0}: Got output stream.", this);
//Create DataWriter
dataWriter = new DataWriter(asyncOutput.GetResults());
#else
...
#endif
}
public void SendBuffer(ByteBuffer buffer, int wait = 0)
{
#if WINRT
Logger.Trace("{0}: Sending buffer. Wait = {1}", this, wait);
for (int i = 0; i < buffer.WriteSize(); i++)
dataWriter.WriteByte(buffer.Buffer()[i]);
DataWriterStoreOperation op = dataWriter.StoreAsync();
if (wait != 0) op.AsTask().Wait(wait);
else op.AsTask().Wait();
Logger.Trace("{0}: Sending complete.", this);
#else
...
#endif
}
Einige relevante Protokolle:
04/23 19:08:57.504 DEBUG: Area Sync: UdpSocketClient created. Binding to port [any].
04/23 19:08:57.505 TRACE: Area Sync: Bind Complete to port 59518
04/23 19:08:57.506 TRACE: Area Sync: Getting output stream to 71.227.179.128:1302.
04/23 19:08:57.507 TRACE: Area Sync: Got output stream.
04/23 19:08:57.604 TRACE: Area Sync: Sending contact packet.
04/23 19:08:57.604 TRACE: Area Sync: Sending buffer. Wait = 0
04/23 19:08:57.605 TRACE: Area Sync: Sending complete.
Starten Sie durch mit einem packet sniffer, um zu sehen, ob der client tatsächlich das senden der Pakete auf das Netzwerk.
Ich bin ziemlich sicher, dass es nicht Pakete zu senden. Ich Laufe das gleiche .Net-code und es funktioniert.
Ich bin ziemlich sicher, dass es nicht Pakete zu senden. Ich Laufe das gleiche .Net-code und es funktioniert.
InformationsquelleAutor Nick Banks | 2012-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich es herausgefunden. Anscheinend ist es gar nicht, wie mein code binden. Die Dokumentation sagt, dass Sie sollten in der Lage sein, um übergeben Sie den Wert null in die binden, aber ich bekam immer eine Ausnahme. Also, es funktioniert, wenn ich die ConnectAsync-API:
InformationsquelleAutor Nick Banks