通用 Windows 上的 UDP 套接字未接收数据
UDP socket on Universal Windows not receiving data
我有一个通过 UDP 套接字接收数据的 WPF 应用程序。现在我需要将它移植到 Universal Windows 平台,但是套接字没有接收到传入的数据。
private void Init()
{
socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.1"), 55156));
socketAsyncArgs = new SocketAsyncEventArgs();
buffer = new byte[4096];
socketAsyncArgs.SetBuffer(buffer, 0, buffer.Length);
socketAsyncArgs.Completed += Receive_Completed;
}
private void Receive()
{
bool isPending = socket.ReceiveAsync(socketAsyncArgs);
if ( ! isPending)
Receive_Completed(socket, socketAsyncArgs);
}
Receive_Completed
方法从未被调用。相同的代码在 WPF 项目中运行良好。我使用 WireShark 来验证数据包是否到来。我也尝试使用 Windows.Networking.Sockets.DatagramSocket
得到相同的结果 - 套接字没有收到任何数据。
你不是必须先连接吗?我不关心 socket.bind 但你必须在 socketAsyncArgs.RemoteEndPoint
中设置一个 IPEndPoint
。请不要打电话给 Receive_Completed!!!这是一个应该自动触发的事件。
我用服务器测试了你的代码并工作了(但在 TCP 和流模式下)
private void Init()
{
socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
socketAsyncArgs = new SocketAsyncEventArgs();
socketAsyncArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 55156);
buffer = new byte[4096];
socketAsyncArgs.SetBuffer(buffer, 0, buffer.Length);
socketAsyncArgs.Completed += Receive_Completed;
}
private void Receive()
{
bool isPending = socket.ConnectAsync(socketAsyncArgs);
if (!isPending)
isPending = socket.ReceiveAsync(socketAsyncArgs);
}
我找到了解决方案。显然,您必须特别启用该应用程序才能接收传入的网络流量。 Visual Studio 中的 UWP 项目包含一个名为 Package.appxmanifest
的文件。双击它,select 功能选项卡并选中 Internet(客户端和服务器)。有关更多信息,请访问 MSDN - Networking basics。
我有一个通过 UDP 套接字接收数据的 WPF 应用程序。现在我需要将它移植到 Universal Windows 平台,但是套接字没有接收到传入的数据。
private void Init()
{
socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.1"), 55156));
socketAsyncArgs = new SocketAsyncEventArgs();
buffer = new byte[4096];
socketAsyncArgs.SetBuffer(buffer, 0, buffer.Length);
socketAsyncArgs.Completed += Receive_Completed;
}
private void Receive()
{
bool isPending = socket.ReceiveAsync(socketAsyncArgs);
if ( ! isPending)
Receive_Completed(socket, socketAsyncArgs);
}
Receive_Completed
方法从未被调用。相同的代码在 WPF 项目中运行良好。我使用 WireShark 来验证数据包是否到来。我也尝试使用 Windows.Networking.Sockets.DatagramSocket
得到相同的结果 - 套接字没有收到任何数据。
你不是必须先连接吗?我不关心 socket.bind 但你必须在 socketAsyncArgs.RemoteEndPoint
中设置一个 IPEndPoint
。请不要打电话给 Receive_Completed!!!这是一个应该自动触发的事件。
我用服务器测试了你的代码并工作了(但在 TCP 和流模式下)
private void Init()
{
socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
socketAsyncArgs = new SocketAsyncEventArgs();
socketAsyncArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 55156);
buffer = new byte[4096];
socketAsyncArgs.SetBuffer(buffer, 0, buffer.Length);
socketAsyncArgs.Completed += Receive_Completed;
}
private void Receive()
{
bool isPending = socket.ConnectAsync(socketAsyncArgs);
if (!isPending)
isPending = socket.ReceiveAsync(socketAsyncArgs);
}
我找到了解决方案。显然,您必须特别启用该应用程序才能接收传入的网络流量。 Visual Studio 中的 UWP 项目包含一个名为 Package.appxmanifest
的文件。双击它,select 功能选项卡并选中 Internet(客户端和服务器)。有关更多信息,请访问 MSDN - Networking basics。