c++ - 如何在MFC 中通过CSocket 发送自定义结构?

标签 c++ mfc

我想像下面这样发送我的自定义结构:

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

但是,由于 CStringList

出现了一些问题

在接收端,CStringList::GetCount() 运行良好,但在获取字符串数据时出现断言错误。

我想一次发送我的数据。

因此,我尝试将 struct 转换为 BYTE 和 char * 但失败了。

如何一次发送结构数据?

最佳答案

您应该将数据转换为字符串形式,即。 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;
}

关于c++ - 如何在MFC 中通过CSocket 发送自定义结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500365/

相关文章:

c++ - 如何在所有可变参数模板参数上调用函数?

c++ - 什么 Visual C++ 设置/选项/标志是 g++ 中 -ansi -pedantic 的对应物

c# - 如何以编程方式读取 .pdf 文件并将其转换为音频(.mp3 格式)?

c++ - 是否可以创建具有 alpha 混合透明度的 CImageList?

C++ vector std::bad_alloc 错误

c++ - 为什么一个类及其预初始化成员 Int 的 reinterpret_cast<const char*> 是相同的,而任何其他类型的变量不是?

visual-c++ - 如何增加mfc中组合框控件的高度?

c++ - CEdit 数字验证事件 C++ MFC

c++ - 如何捕捉 CListCtrl 列宽变化事件?

c++ - 将 Adob​​e AIR 与 C++ 集成