2011-05-28 22 views
1

我的客户端将使用名为annoucement的结构/类与客户端进行通信。我想我会用C++编写服务器。将会有许多不同的类继承annoucement。我的问题是通过网络发送这些类到客户端在C/C++服务器,C/C++和C#客户端之间通过网络发送数据结构

我想也许我应该使用iovec。但是我不知道在C#中是否有与iovec相对应的东西。

的理念是: 我会派一个结构与writev则客户端将使用readv从套接字读取的数据,如这将是一个annoucement类,检查UINT16变量在接收结构推断的确切类型和用apprioprite iovec/readv读取其余数据。

C#可以将整个对象作为数组发送,但是如何在C/C++中解释它?

我希望C/C++和C#客户端能够使用相同的协议,但这是我第一次设计协议,我不确定我的所有想法是否可以一起工作。

任何暗示赞赏。

回答

4

不要试图用结构来定义协议。

定义通告的格式,即按什么顺序构成通告的字节,然后定义如何按顺序传输多个通告。

一旦你定义了这个连线格式,你可以用每种编程语言实现解析器和编写器,使用每个编程语言中最合适的编程语言结构,库和框架。

一个很好的例子因为这是protobuf的format specificationC++, Java, Python implementation.NET implementation

1

这个问题有点混乱,但我有一种感觉,你可能有兴趣在Protocol Buffers有效地序列化数据并通过网络传输它。

0
  1. 使用fifo缓冲区。如果你不知道那是什么,让我知道你生病没有问题。 2.使用套接字,不要使用writev。在C#中,使用tcpClient,或者你认为有必要的东西。 3.在C/C++中,你可以使用struts来对齐你的数据,这样当你通过线路发送它时,一切都很好,从填充的支柱开始投射到一个指针,然后在调用中使用该指针发送将结构的实际数据大小设置为数据的Len(因为发送调用期望char *数据类型,所以不必担心,因为一个字节无论如何都是无符号的字符)回到C#中,在C/C++中没有那么奢侈,我建议使用一个StringBuilder类将数据收集到它的缓冲区中,如果你知道你的数据大小,它实际上是从线上字节对齐的,你必须(因为它只是C#中的Unicode,没有ASCII,第一次将字符串转换为ASCII数据类型(这一切都取决于你的机器设置的UTF代码页,并根据你的问题ID判断你不在同一个机器上:),该工作的工具是(我认为)System.Text.Encoding.GetEncoding(“CodePageString”)。GetBytes( - 插入stringbuilders。ToCharArray函数);并保存所有的字节的缓冲区,你可以从寻找收到数据的lenth要么关闭套接字调用,或从StringBuilder的,那么你可以看看你的数据在biniary格式设置,只记得虽然总是使用htons和ntohs(主机到网络的顺序,以及网络到主机的顺序)(不会进入小端和大端)。按照所有这一切,你会中堂0提高警惕;)
相关问题