private void ReadCallback(UvStreamHandle streamHandle, int status, ref UvNative.uv_buf_t buf) { if (status > 0) { try { MemorySegmentByteBuffer byteBuf = _byteBufProvider.WrapMemorySegment(buf.Memory, buf.Len); byteBuf.SetWrite(status); this.Receive(byteBuf); } catch (Exception e) { Console.WriteLine(e); streamHandle.ReadStop(); streamHandle.Close(); } } else if (status == 0) { // TODO: Console.WriteLine("ReadCallback. No data to read."); } else { string error = string.Format( "Error #{0}. {1} {2}", status, Marshal.PtrToStringAnsi(UvNative.uv_err_name(status)), Marshal.PtrToStringAnsi(UvNative.uv_strerror(status)) ); // TODO: Console.WriteLine("ReadCallback. {0}.", error); } }
// private void WriteCallback(UnmanagedByteBuf byteBuf) // { // // TODO: обрабатывать статус с ошибкой. // // byteBuf.Release(); // } private void AllocCallback( UvStreamHandle streamHandle, int suggestedsize, out UvNative.uv_buf_t buf) { // Тут мы можем просто взять поинтер, без буфера. Все равно поинтер не потеряется и будет передан // в ReadCallback, где будет завернут в буфер. try { IntPtr dataPtr = _byteBufProvider.GetDefaultDataIntPtr(out int size); buf = new UvNative.uv_buf_t(dataPtr, size, PlatformApis.IsWindows); } catch (Exception e) { Console.WriteLine(e); streamHandle.ReadStop(); streamHandle.Close(); buf = new UvNative.uv_buf_t(); } }