2011-08-17 55 views
1

这是C++的消息,我需要从C#传递:如何从C#套接字发送C++结构消息?

 

struct LoginMessage:public NMessage 
{ 

char szUser[ 16 ]; 
char szPass[ 16 ]; 

    LoginMessage() 
    { 
     msgId = CTRL_SESSION_LOGIN; 
     msgSize = sizeof(LoginMessage); 
    } 

}; 

struct NMessage 
{ 
    DWORD   msgSize; 
    union 
    { 
     DWORD  msgId; 
     struct 
     { 
      BYTE msgId0; 
      BYTE msgId1; 
      BYTE msgId2; 
      BYTE msgId3; 
     }; 
    }; 

    NMessage() 
    { 
    } 

    BOOL IsLegal() 
    { 
     return msgSize>=sizeof(NMessage) && msgSize 

什么是这个C#中的等效,使得C++可以理解此消息? 示例代码非常感谢。

回答

1

回答我的问题..

 

     [StructLayout(LayoutKind.Sequential)] 
     public struct LoginMessage 
     { 
      public int msgSize; 
      public int msgId; 

      [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)] 
      public string szUser; 

      [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)] 
      public string szPass; 
     } 
 

它采取类属性的序列的音符,让你发到C字节数组++是完全一样的东西,它预计是很重要的。

0

看看this。这是一个很好的编组指导。

0

我通常使用这样的东西手动序列化数据。

class NMessage { 

    byte[] buffer; 

    //ctor to create a new message for sending. 
    public NMessage(int nSize) { 
     buffer = new byte[nSize]; 
     Buffer.BlockCopy(BitConverter.GetBytes(nSize), 0, buffer, 0, sizeof(UInt32)); 
    } 

    //ctor to create msg from received data. 
    publix NMessage(byte[] buffer) { 
     this.buffer = buffer; 
    } 

    public UInt32 MessageId { 
     get { return BitConverter.ToUInt32(buffer, 4); 
     set { Buffer.BlockCopy(BitConverter.GetBytes(value), 0, buffer, 4, sizeof(UInt32)); } 
    } 

    ...   

    public Byte MessageId2 { 
     get { return buffer[6]; } 
     set { buffer[6] = value; } 
    } 

    ... 

    public UInt32 Size { 
     get { return BitConverter.ToUInt32(buffer, 0) } 
    } 

    public Byte[] Buffer { 
     get { return buffer; } 
    } 
} 

class LoginMessage : NMessage { 

    Encoding encoding = new ASCIIEncoding(); //or whatever encoding you need. 

    public LoginMessage() : base(16 + 16) { 
     this.MessageId = CTRL_SESSION_LOGIN; 
    } 

    public LoginMessage(NMessage message) : base(message.Buffer) { 
    } 

    public string User { 
     get { return encoding.GetString(buffer, 8, 16); } 
     set { Buffer.BlockCopy(encoding.GetBytes(value), 0, buffer, 8, 16); 
    } 

    public string Pass { 
     get { return encoding.GetString(buffer, 24, 16); } 
     set { Buffer.BlockCopy(encoding.GetBytes(value), 0, buffer, 24, 16); 
    } 
} 

所以您只需创建你的新邮件,设置它的数据,然后发送缓冲区属性。

Send((new LoginMessage { 
       User = "user", 
       Pass = "pass", 
      }).Buffer); 

在接收端,如果您有足够的数据,您可以从您收到的字节[]中构建消息。

byte[] recvBuf = new byte[MAX_RECV]; 
int recvSize = Receive(recvBuf); 
... 
var message = new NMessage(recvBuf); 
if (message.MessageId == CTRL_SESSION_LOGIN) 
    var login = new LoginMessage(message); 
    var user = login.User; 
    ... 

这只是一个粗略的概述,无论如何,代码显然需要清理,因为我减少了它只是为了演示这个想法。