2011-08-17 56 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; 
    ... 

這只是一個粗略的概述,無論如何,代碼顯然需要清理,因爲我減少了它只是爲了演示這個想法。