我遇到以下问题: 我正在使用UDP在本地网络中通信两台不同的计算机。
在一方面,我有一台安装了4.5框架的Windows 7机器。我正在使用System.Net类 使用此代码:
public static void UDPWriter()
{
Task.Run(async () =>
{
byte[] data = new byte[10000];
IPEndPoint ipep = new IPEndPoint(IPAddress.Pars("192.168.0.16"), 5002);
Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpClient.Connect(ipep);
while (true)
{
await Task.Delay(24);
string input = packagetosend;
data = Encoding.ASCII.GetBytes(input);
var receivedResults = udpClient.Send(data, SocketFlags.None);
}
});
}
另一方面,我使用的是使用此代码的Windows 10 Universal App:
async static private void EnablerListener()
{
//Click
HostName hostname = new HostName("192.168.0.16");
listener = new DatagramSocket();
listener.Control.InboundBufferSizeInBytes=10000;
listener.MessageReceived += socket_MessageReceived;
await listener.BindServiceNameAsync("5002");
}
static void socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
// Message received. Place your logic here
}
当我发送一个“小”包(我的理论是小于MTU)时,我会正确收到发送的内容。
问题来自于我的udp包是碎片化的。当我发送1个分为4个的软件包时(我在Wireshark中看到过),Windows 10软件没有收到任何内容。我试过更改listener.Control.Donotfragment(也许我使用它错了)但它似乎无法正常工作。 UPDATE1: 在wireshark中,我收到此消息 超出生存时间(超出片段重组时间)只有Wireshark中的一些软件包,其他软件包成功重组(几乎全部)
答案 0 :(得分:3)
在UWP上使用环回的本地机器IPC受到限制。我最近自己遇到了这个问题。也许考虑一种不同的方法,如App-to-App Communication - https://channel9.msdn.com/Events/Build/2015/3-765
来自DatagramSocket示例:
注意使用IP环回地址的网络通信不能 通常用于Universal之间的进程间通信 Windows平台(UWP)应用程序和不同的进程(不同的UWP 应用程序或桌面应用程序)因为这受到网络隔离的限制。 允许使用IP环回地址的网络通信 UWP应用程序中用于通信目的的相同过程。更多 信息,请参阅如何设置网络功能。
https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/DatagramSocket(在底部)