public unsafe void Execute(UdpSocketReceiveResult target) { target.Pin(buffer.Data); IntPtr array = Marshal.UnsafeAddrOfPinnedArrayElement(buffer.Data, buffer.Offset); Overlapped overlapped = new Overlapped { AsyncResult = target }; NativeOverlapped *native = overlapped.UnsafePack(null, null); TcpSocketInterop.WSABuffer data = new TcpSocketInterop.WSABuffer { length = buffer.Count, buffer = array }; byte[] addressData = new byte[16]; IntPtr addressPointer = Marshal.UnsafeAddrOfPinnedArrayElement(addressData, 0); target.Address = addressData; target.Pin(addressData); int read, flags = 0, size = addressData.Length; int result = UdpSocketInterop.WSARecvFrom(handle, &data, 1, out read, ref flags, addressPointer, ref size, native, IntPtr.Zero); uint error = TcpSocketInterop.GetLastError(); if (result == -1 && error != 997) { target.Fail(error); } }
public void Receive(SocketBuffer buffer, UdpSocketReceiveCallback callback) { UdpSocketReceiveRoutine routine = new UdpSocketReceiveRoutine(handle, buffer); UdpSocketReceiveResult result = new UdpSocketReceiveResult { Socket = this, Buffer = buffer, OnReceived = callback }; routine.Execute(result); }