首页 > 解决方案 > C# UdpClient 发送中断接收和 WCF

问题描述

我正在尝试创建一个简单的应用程序来在 DualMode 下测试 UdpClient。这个想法是你运行两个不同版本的应用程序,它们具有相反的发送和接收端口,它们相互发送数据包。这只是一个概念证明。发生的事情是,当我执行 UdpClient.Send 时,即使发送和接收位于不同的端口上,它也会在没有数据的情况下中断接收。更糟糕的是,当我在我的主应用程序中尝试此操作时,它还会关闭我在 net.tcp 上运行的 WCF 连接。这是代码:

        static void Main(string[] args)
        {
            int port = int.Parse(args[0]);
            int destPort = int.Parse(args[1]);

            Console.Out.WriteLine($"Listening on {port}");
            Console.Out.WriteLine($"Sending to {destPort}");

            var client = CreateDualClient(port);

            Task.Factory.StartNew(() =>
            {
                IPEndPoint from = new IPEndPoint(IPAddress.Any, 0);

                while (!Console.KeyAvailable)
                {
                    try
                    {
                        var fromdata = client.Receive(ref from);
                        Console.Out.WriteLine($"Received {fromdata.Length} bytes from {from.ToString()}");
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }
            });

            //client.BeginReceive(UdpPacketReceived, new ReceiverData() {Client = client, IsMulticast = false});

            var data = new byte[400];
            var ip = Dns.GetHostAddresses("localhost");
            var destEndpoint = new IPEndPoint(ip[0], destPort);
            while (!Console.KeyAvailable)
            {
                Console.Out.WriteLine($"Sending To {destEndpoint}");
                client.Send(data, data.Length, destEndpoint);
                Thread.Sleep(1000);
            }
        }

        public static UdpClient CreateDualClient(int port)
        {
            var client = new UdpClient(AddressFamily.InterNetworkV6);

            client.ExclusiveAddressUse = false;
            client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            
            client.Client.DualMode = true;

            var ep1 = new IPEndPoint(IPAddress.IPv6Any, port);

            client.Client.Bind(ep1);

            return client;
        }

例外是:

"System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP)
   at System.Net.Sockets.UdpClient.Receive(IPEndPoint& remoteEP)
   at UdpDualCastTest.Program.<>c__DisplayClass0_0.<Main>b__0() in D:\Subversion\Starfish\Trunk\code\UdpDualCastTest\Program.cs:line 34

如果我注释掉发送,我不会得到例外。如果我忽略异常但运行另一个应用程序,则异常会停止发生,直到我杀死相反的应用程序(相同的应用程序,但参数颠倒了)。

我在这里做错了什么?为什么发送会破坏我的接收,同时也会破坏我的 WCF net.tcp 连接?

标签: c#socketexceptionudpclient

解决方案


推荐阅读