/// <summary> /// 发送SOCKET消息 /// </summary> public void SendMsg(int uMsgID, ByteBuffer buffer) { NFMsg.MsgBase xData = new NFMsg.MsgBase(); xData.player_id = Util.NFToPB(mMainID); ByteBuffer newbuffer = new ByteBuffer(buffer.ToBytes()); xData.msg_data = newbuffer.ReadBytes(); MemoryStream body = new MemoryStream(); Serializer.Serialize <NFMsg.MsgBase>(body, xData); MsgHead head = new MsgHead(); head.unMsgID = (UInt16)uMsgID; head.unDataLen = (UInt32)body.Length + (UInt32)ConstDefine.NF_PACKET_HEAD_SIZE; byte[] bodyByte = body.ToArray(); byte[] headByte = StructureTransform.StructureToByteArrayEndian(head); byte[] sendBytes = new byte[head.unDataLen]; headByte.CopyTo(sendBytes, 0); bodyByte.CopyTo(sendBytes, headByte.Length); SocketClient.SendMessage(sendBytes); buffer.Close(); newbuffer.Close(); }
public static byte[] StructureToByteArrayEndian(object obj) { object thisBoxed = obj; Type test = thisBoxed.GetType(); int offset = 0; byte[] data = new byte[Marshal.SizeOf(thisBoxed)]; object fieldValue; TypeCode typeCode; byte[] temp; foreach (var field in test.GetFields()) { fieldValue = field.GetValue(thisBoxed); // Get value typeCode = Type.GetTypeCode(fieldValue.GetType()); // get type switch (typeCode) { case TypeCode.Single: // float { temp = BitConverter.GetBytes((Single)fieldValue); StructureTransform.Reverse(temp); Array.Copy(temp, 0, data, offset, sizeof(Single)); break; } case TypeCode.Int32: { temp = BitConverter.GetBytes((Int32)fieldValue); StructureTransform.Reverse(temp); Array.Copy(temp, 0, data, offset, sizeof(Int32)); break; } case TypeCode.UInt32: { temp = BitConverter.GetBytes((UInt32)fieldValue); StructureTransform.Reverse(temp); Array.Copy(temp, 0, data, offset, sizeof(UInt32)); break; } case TypeCode.Int16: { temp = BitConverter.GetBytes((Int16)fieldValue); StructureTransform.Reverse(temp); Array.Copy(temp, 0, data, offset, sizeof(Int16)); break; } case TypeCode.UInt16: { temp = BitConverter.GetBytes((UInt16)fieldValue); StructureTransform.Reverse(temp); Array.Copy(temp, 0, data, offset, sizeof(UInt16)); break; } case TypeCode.Int64: { temp = BitConverter.GetBytes((Int64)fieldValue); StructureTransform.Reverse(temp); Array.Copy(temp, 0, data, offset, sizeof(Int64)); break; } case TypeCode.UInt64: { temp = BitConverter.GetBytes((UInt64)fieldValue); StructureTransform.Reverse(temp); Array.Copy(temp, 0, data, offset, sizeof(UInt64)); break; } case TypeCode.Double: { temp = BitConverter.GetBytes((Double)fieldValue); StructureTransform.Reverse(temp); Array.Copy(temp, 0, data, offset, sizeof(Double)); break; } case TypeCode.Byte: { data[offset] = (Byte)fieldValue; break; } default: { //System.Diagnostics.Debug.Fail("No conversion provided for this type : " + typeCode.ToString()); break; } } ; // switch if (typeCode == TypeCode.Object) { int length = ((byte[])fieldValue).Length; Array.Copy(((byte[])fieldValue), 0, data, offset, length); offset += length; } else { offset += Marshal.SizeOf(fieldValue); } } // foreach return(data); } // Swap