最佳实践:通过TCP发送类型化数据

时间:2013-05-03 13:47:05

标签: c++ web-services sockets soap tcp

我想实现一个服务器,它有一些方法,从中接受一个二维点数组(一个结构)。我想知道我是应该将它实现为WebService还是简单的TCP套接字。

目标系统是在Debian Linux上运行的C ++。据我所知,WebService基于XML / SOAP,我可以在任何其他客户端系统上使用包括其所有数据类型的接口。相反,普通的TCP套接字只是读取字节数组。但有没有一种简单的方法来实现TCP套接字的强类型数据传输,这样我就不需要Web服务器来运行WebService了?

这是一个C#示例服务器的接口应该是什么样的:

public interface IService
{
    void CloseShutter();
    bool WriteFrame(Point[] frame, bool repeat);
    MaintenanceInfo GetMaintenanceInfo();
}

public struct Point
{
    public float X { get; set; }    
    public float Y { get; set; }
    public float Z { get; set; }
    public int Color { get; set; }
    public bool Draw { get; set; }
}

public struct MaintenanceInfo
{
    public uint Lifetime { get; set; }
    public bool UsedHours { get; set; }
}

感谢您的任何建议。

的Matthias

3 个答案:

答案 0 :(得分:1)

您可以使用XML-RPC for C ++:http://xmlrpc-c.sourceforge.net/

答案 1 :(得分:1)

轻量级方法是使用序列化。看一下boost :: serialization命名空间或任何其他能很好地完成它的库。这样,您可以直接在tcp流中编写序列化对象,并将它们返回到另一端。如果您想要一个人类可读的格式,请将它们序列化为xml。

否则,您可以将原始结构复制到输出缓冲区中。您可以反转您的结构以尊重网络标准字节顺序。还要充分了解数据填充。

答案 2 :(得分:1)

在TCP而不是普通套接字上使用抽象层有许多优点。通常这些解决方案使用XML或任何类似的人类可读格式。然后将数据序列化并通过标准TCP套接字发送。通过这种方式实现了跨平台通信(此处为:C ++,objective-C到C#),您可以将客户端/服务器用作代码中的对象。

到目前为止,我找到的最佳解决方案之一是:

a)Apache Thrift:Pro:易于设置,只需几行自动生成的代码。缺点:使用非XML的专有数据格式。

b)gSOAP:Pro:广泛使用并基于SOAP / XML WebServices。缺点:不容易学习。

c)CodeSynthesis XSD/e Boost.Asio:使用具有底层TCP套接字的流发送和接收XML文档(或可以从XML转换为XML的对象)。 Pro:基于套接字,没有SOAP / WebService。缺点:更多代码行和更多必要的学习。