| /*--------------------------------------------------------------------------------------------- | |
| * Copyright (c) Microsoft Corporation. All rights reserved. | |
| * Licensed under the MIT License. See License.txt in the project root for license information. | |
| *--------------------------------------------------------------------------------------------*/ | |
| using System; | |
| using System.Net; | |
| using System.Net.Sockets; | |
| namespace Microsoft.Unity.VisualStudio.Editor.Messaging | |
| { | |
| internal class UdpSocket : Socket | |
| { | |
| // Maximum UDP payload is 65507 bytes. | |
| // TCP mode will be used when the payload is bigger than this BufferSize | |
| public const int BufferSize = 1024 * 8; | |
| internal UdpSocket() | |
| : base(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) | |
| { | |
| SetIOControl(); | |
| } | |
| public void Bind(IPAddress address, int port = 0) | |
| { | |
| Bind(new IPEndPoint(address ?? IPAddress.Any, port)); | |
| } | |
| private void SetIOControl() | |
| { | |
| if (!VisualStudioEditor.IsWindows) | |
| return; | |
| try | |
| { | |
| const int SIO_UDP_CONNRESET = -1744830452; | |
| IOControl(SIO_UDP_CONNRESET, new byte[] { 0 }, new byte[0]); | |
| } | |
| catch | |
| { | |
| // fallback | |
| } | |
| } | |
| public static byte[] BufferFor(IAsyncResult result) | |
| { | |
| return (byte[])result.AsyncState; | |
| } | |
| public static EndPoint Any() | |
| { | |
| return new IPEndPoint(IPAddress.Any, 0); | |
| } | |
| } | |
| } | |