问题描述
我的基类中有以下代码(下面提供了片段)用于处理 UDP 套接字.我正在添加对 WinRT 的支持(由 #define for WINRT 控制).我的一切都适用于 .Net,但我的 WinRT 实现出了点问题.当我发送数据时,服务器端没有收到它.知道出了什么问题吗?我在客户端没有看到任何错误,只是服务器上没有显示任何内容.我已经成功地让我的 TCP 套接字类工作,以类似的方式使用 DataWriter.
I have the following code (snips provided below) in my base class for handling a UDP socket. I am adding support for WinRT (controlled by the #define for WINRT). I have everything working for .Net, but something is going wrong with my WinRT implementation. When I send the data, it is not being received on the server side. Any idea what is going wrong? I don't see any errors on the client side, just nothing shows up on the server. I have successfully gotten my TCP socket class working, using the DataWriter in a similar way.
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
}
一些相关的日志:
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.
推荐答案
我想通了.显然它不喜欢我的绑定代码.文档说你应该能够将 null 传递到绑定中,但我总是有一个例外.因此,如果我使用 ConnectAsync API,它会起作用:
I figured it out. Apparently it doesn't like my bind code. The documentation says that you should be able to pass null into the bind, but I always got an exception for that. So, it works if I use the ConnectAsync API:
public UdpSocketClient(IPEndPoint remoteEndPoint, int localPort)
{
this.remoteEndPoint = remoteEndPoint;
#if WINRT
this.socket = new DatagramSocket();
this.socket.MessageReceived += ReceiveCallback;
Logger.Trace("{0}: Connecting to {1}.", this, remoteEndPoint);
IAsyncAction connectAction = this.socket.ConnectAsync(remoteEndPoint.address, remoteEndPoint.port.ToString());
connectAction.AsTask().Wait();
Logger.Trace("{0}: Connect Complete. Status {1}, ErrorCode {2}", this, connectAction.Status,
connectAction.ErrorCode != null ? connectAction.ErrorCode.Message : "None");
dataWriter = new DataWriter(this.socket.OutputStream);
#else
...
#endif
}
这篇关于正确使用UDP DatagramSocket的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!