2012-11-27 56 views
3

我经由使用SENDTOrecvfrom的功能Winsock的交换数据,但在每个第二参数是的char * buf中。我想发送一个自定义数据,如MyStruct *,但我无法找到这些功能的类似物与void *一起使用。我只是害怕,以字符串格式发送数据,然后解析它可能是缓慢和无效的。但是,也许有强有力的理由迫使程序员以这种方式发送数据?欢迎任何关于情况和任何建议的信息。提前致谢。如何使用winsock(C++)发送 recv非char数据?

回答

3

如果您struct包含任何指针或手柄和接收器是由你使用相同的编译器和编译标志写的,你不关心可移植性(如big-endian体系结构),那么你可以投你的MyStruct*char*,它会工作。

在其他情况下,你将死于一次可怕的死亡。不,认真。它不会工作。指针和句柄在另一台机器上没有意义,并且使用不同的编译器或编译标志可能会导致struct具有稍微不同的布局或填充,使其无法使用。

通常通过网络发送结构,除极少数情况外,需要serialization

+0

非常感谢,达蒙。我确实计划可移植性,所以谢谢你让我知道序列化吧。要去挖掘它并试图弄清楚序列化\反序列化是否会减慢应用程序的运行速度。 – JacksonRR

+0

它是否减慢应用程序并不重要 - 它必须工作。如果它不起作用,即使速度很快也没用。当需要序列化时,这是必要的。在重新发明轮子之前,请查看[protocol buffers](http://code.google.com/p/protobuf/)或[msgpack](http://msgpack.org/)是否可以接受。它们相当快速和高效,并且使用已有的工具可以节省数周/数月的时间。 – Damon

4

不管它是char*还是void*套接字都可以与原始字节一起工作。因此,只要投你的缓冲区(char*),这就是它

+0

谢谢,似乎工作。 – JacksonRR