【问题标题】:How to send\recv non char data with winsock (c++)?如何使用 winsock (c++) 发送\recv 非字符数据?
【发布时间】:2012-11-14 23:54:34
【问题描述】:

我正在使用 sendtorecvfrom 函数通过 winsock 交换数据,但每个函数中的第二个参数是 char* buf。我想发送像 MyStruct* 这样的自定义数据,但我找不到与 void* 一起使用的类似函数。我只是担心,以字符串格式发送数据然后解析它可能会很慢且无效。但是,也许有充分的理由强迫程序员以这种方式发送数据?欢迎任何有关情况的信息和任何建议。提前致谢。

【问题讨论】:

    标签: c++ windows networking winsock


    【解决方案1】:

    不管是char* 还是void* 套接字都可以处理原始字节。因此,只需将缓冲区转换为 (char*) 就可以了

    【讨论】:

      【解决方案2】:

      如果您的struct 确实包含任何指针或句柄并且接收器是由您使用相同的编译器和编译标志编写的,并且您不关心可移植性(例如大端架构),那么您只需将您的 MyStruct* 转换为 char* 即可。

      在其他任何情况下,你都会死得很惨。不,认真的。它行不通。指针和句柄在另一台机器上没有意义,使用不同的编译器或编译标志可能会导致 struct 的布局或填充略有不同,从而使其无用。

      通过网络发送结构通常需要serialization,除了极少数例外。

      【讨论】:

      • 非常感谢,达蒙。我正在规划可移植性,所以谢谢你让我知道序列化ю 会挖掘它并尝试弄清楚序列化\反序列化是否会减慢应用程序的速度。
      • 它是否会减慢应用程序的速度并不重要——它必须有效。如果它不起作用,即使它很快也没有用。当需要序列化时,它是必要的。在重新发明轮子之前,请查看 protocol buffersmsgpack 是否适合您。它们相当快速和高效,并且使用已经有效的东西可以节省数周/数月的时间。
      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多