我有一个通过UDP套接字接收数据的WPF应用程序。现在我需要将它移植到通用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
得到相同的结果 - 套接字没有收到任何数据。
答案 0 :(得分:1)
我找到了解决方案。显然,您必须专门启用应用程序将接收传入的网络流量。 Visual Studio中的UWP项目包含名为Package.appxmanifest
的文件。双击它,选择功能选项卡并检查Internet(客户端和服务器)。有关MSDN - Networking basics的更多信息。
答案 1 :(得分:0)
你不必先连接吗?我不关心socket.bind,但你必须在IPEndPoint
中设置一个socketAsyncArgs.RemoteEndPoint
。请不要致电Receive_Completed !!!它应该自动触发它。
我用服务器测试了你的代码并且工作了(但是在TCP和Stream模式下)
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);
}