通过网络发送数据的常用方法是什么?

时间:2014-08-06 06:22:25

标签: c++ sockets

在C#中,我使用二进制序列化在Stream上发送信息。这很简单,因为您所做的只是创建一个类,对其进行序列化,然后在接收端对其进行反序列化。

我的问题是,如何在C ++中做类似的事情?我见过的所有网络示例都发送了一个const char * like;

send("LOGIN");

如果我希望通过网络发送一个字符串和一个整数,我是否真的要麻烦将两者都转换为字符串,在它前面放一个命令,然后发送;

[PSEUDO-CODE]
send("COMMAND|" + tostring(someInteger) + "|" + someString);

然后在接收端,拆分此字符串并解析?我想,当我存储了一个矢量并且我想通过网络发送它时,这会变得复杂。

我该怎么办?

3 个答案:

答案 0 :(得分:2)

有几种serialization格式和库(但在C ++ 11标准之外)。

实际上,您的问题是特定于操作系统的。我想你使用Linux或一些Posix系统。

我通常建议在textual format中进行序列化(更容易调试)。然后考虑像JSON(或YAML,甚至XML这样的格式 - 但我不推荐它,因为它过于复杂等等...)并使用像{{{} {3}}

在大多数情况下(但并非总是!),网络传输 - 毫秒 - 比序列化计算慢得多 - 微秒 - 因此文本序列化开销并不重要

如果您想要一些二进制序列化(谨防JSONCPP问题),请考虑endianesslibs11n等...另请参阅XDR

始终文档(并及时了解文档)htonl(3)

对于传输,请使用TCP / IP(或其上方的内容,例如protocolHTTP等)。在Linux和Posix上,请参阅0MQsocket(7)并阅读一些tcp(7)

您可能需要使用tutorial on BSD sockets对某些event loop进行编码(或使用现有的事件循环框架,libevlibevent Glib 来自Qt的GTK, QtCore 等等......)

另请参阅poll(2)JSON-RPC

答案 1 :(得分:1)

C#具有Windows Communication Foundation(WCF),您可以使用它来序列化&通过网络发送消息。它还通过HTTP,TCP或HTTPS处理底层传输。您可以在此处了解更多信息: http://msdn.microsoft.com/en-us/library/vstudio/ms731079%28v=vs.90%29.aspx

答案 2 :(得分:-1)

谷歌的protobuf库实际上还不错