如何通过MFC中的CSocket发送自定义结构?

时间:2014-03-19 08:42:36

标签: c++ mfc

我想发送我的自定义结构,如下所示:

struct Setup
{
int nPort;
BOOL bFirstType;
BOOL bSecondType;
CStringList strPreset1;
CStringList strPreset2;
};

但是,由于CStringList

,存在一些问题

在接收方,CStringList::GetCount()运行良好,但在获取字符串数据时发生了断言错误。

我想一次发送数据。

所以,我试图将struct转换为BYTE和char *但是失败了。

我如何一次发送结构数据?

2 个答案:

答案 0 :(得分:1)

您应该将数据转换为字符串形式,即。 json或xml,并将其作为文本发送,然后在另一侧解析它并重新创建结构。

不确定您是如何尝试将结构转换为BYTE的,以及如何失败,但如果正确完成,则上述工作将会起作用。

--- [编辑] ---

我忘了MFC提供的CArchive类与CMemFile一起可能对序列化有用。这种解决方案实际上可以在两个MFC应用程序之间使用。

struct Setup
{
int nPort;
BOOL bFirstType;
BOOL bSecondType;
CStringList strPreset1;
CStringList strPreset2;
};

int main()
{
  Setup in;
  in.nPort = 81;
  in.bFirstType = TRUE;
  in.bSecondType = FALSE;
  in.strPreset1.AddTail(_T("test1a"));
  in.strPreset1.AddTail(_T("test1b"));
  in.strPreset1.AddTail(_T("test1c"));
  in.strPreset2.AddTail(_T("test2a"));
  in.strPreset2.AddTail(_T("test2b"));
  in.strPreset2.AddTail(_T("test2c"));

  // Serialization part
  CMemFile memfile;
  CArchive ar(&memfile, CArchive::store);

  ar << in.nPort;
  ar << in.bFirstType;
  ar << in.bSecondType;
  in.strPreset1.Serialize(ar);
  in.strPreset2.Serialize(ar);      
  ar.Close();

  INT dataLen = (INT)memfile.GetLength();
  BYTE* data = memfile.Detach();

  // Copy serialized data to some buffer, or to Socket, File, etc.
  std::vector<BYTE> toSent(data, data + dataLen);

  free(data); // after detach and when no longer needed must be freed with free()



  // Now, ie. your second application received your data, so deserialize it.

  CMemFile memfile2;
  memfile2.Attach(&toSent.front(), toSent.size());
  CArchive ar2(&memfile2, CArchive::load);

  Setup out;    
  ar2 >> out.nPort;
  ar2 >> out.bFirstType;
  ar2 >> out.bSecondType;
  out.strPreset1.Serialize(ar2);
  out.strPreset2.Serialize(ar2);
  ar2.Close();


  // Verify if ok, just for testing purposes
  ASSERT(in.nPort == out.nPort);
  ASSERT(in.bFirstType == out.bFirstType);
  ASSERT(in.bSecondType == out.bSecondType);
  ASSERT(in.strPreset1.GetSize() == out.strPreset1.GetSize());
  ASSERT(in.strPreset2.GetSize() == out.strPreset2.GetSize());

  return 0;
}

答案 1 :(得分:0)

您可以将结构序列化为文本字符串/字节/流(如json,xml,协议缓冲区等),并通过CSocket发送出去,当您收到序列化数据时,将其反序列化,然后您就可以处理它了。