public static MonitorEvent Read(SocketBase s) { Msg msg = s.Recv(0); if (msg == null) { return(null); } int pos = 0; ByteArraySegment data = msg.Data; SocketEvent @event = (SocketEvent)data.GetInteger(Endianness.Little, pos); pos += 4; int len = (int)data[pos++]; string addr = data.GetString(len, pos); pos += len; int flag = (int)data[pos++]; Object arg = null; if (flag == ValueInteger) { arg = data.GetInteger(Endianness.Little, pos); } else if (flag == ValueChannel) { IntPtr value; if (SizeOfIntPtr == 4) { value = new IntPtr(data.GetInteger(Endianness.Little, pos)); } else { value = new IntPtr(data.GetLong(Endianness.Little, pos)); } GCHandle handle = GCHandle.FromIntPtr(value); Socket socket = null; if (handle.IsAllocated) { socket = handle.Target as Socket; } handle.Free(); arg = socket; } return(new MonitorEvent(@event, addr, arg)); }
public static MonitorEvent Read([NotNull] SocketBase s) { var msg = new Msg(); msg.InitEmpty(); s.Recv(ref msg, SendReceiveOptions.None); int pos = 0; ByteArraySegment data = msg.Data; var @event = (SocketEvent)data.GetInteger(Endianness.Little, pos); pos += 4; var len = (int)data[pos++]; string addr = data.GetString(len, pos); pos += len; var flag = (int)data[pos++]; Object arg = null; if (flag == ValueInteger) { arg = data.GetInteger(Endianness.Little, pos); } else if (flag == ValueChannel) { IntPtr value = s_sizeOfIntPtr == 4 ? new IntPtr(data.GetInteger(Endianness.Little, pos)) : new IntPtr(data.GetLong(Endianness.Little, pos)); GCHandle handle = GCHandle.FromIntPtr(value); AsyncSocket socket = null; if (handle.IsAllocated) { socket = handle.Target as AsyncSocket; } handle.Free(); arg = socket; } return(new MonitorEvent(@event, addr, arg)); }
public void IntLittleEndian() { ByteArraySegment byteArraySegment = new ByteArraySegment(new byte[4]); byteArraySegment.PutInteger(Endianness.Little, 1, 0); Assert.AreEqual(1, byteArraySegment[0]); Assert.AreEqual(0, byteArraySegment[3]); long num = byteArraySegment.GetInteger(Endianness.Little, 0); Assert.AreEqual(1, num); byteArraySegment.PutInteger(Endianness.Little, 16777216, 0); Assert.AreEqual(1, byteArraySegment[3]); Assert.AreEqual(0, byteArraySegment[0]); num = byteArraySegment.GetInteger(Endianness.Little, 0); Assert.AreEqual(16777216, num); }