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

C++ 最佳实践:通过TCP发送类型化数据,c++,web-services,sockets,soap,tcp,C++,Web Services,Sockets,Soap,Tcp,我想实现一个服务器,它有几个方法,可以从中接受二维点数组(结构)。我想知道是应该将其实现为一个Web服务还是一个简单的TCP套接字 目标系统是在Debian Linux上运行的C++。据我所知,Web服务是基于XML/SOAP的,我可以在任何其他客户机系统上使用该接口,包括其所有数据类型。相反,普通TCP套接字只是读取字节数组。但是有没有一种简单的方法可以通过TCP套接字实现某种强类型的数据传输,这样我就不需要Web服务器来运行Web服务了 下面是一个C#示例,说明服务器的接口应该是什么样子:

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

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

下面是一个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; }
}
谢谢你的建议


马蒂亚斯

可以使用XML- RPC为C++:

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


否则,您可以将原始结构复制到输出缓冲区中。您可以反转结构以遵守网络标准endianness。也可以进行数据填充。

在TCP之上使用抽象层而不是普通套接字具有许多优点。通常,这些解决方案使用XML或任何类似的人类可读格式。然后将数据序列化并通过标准TCP套接字发送。这样,实现了跨平台的通信(这里是C++、ObjuleC到C),并且可以使用客户机/服务器作为代码中的对象。 到目前为止,我找到的最佳解决方案之一是:

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

b) :Pro:广泛使用并基于SOAP/XML Web服务。缺点:学起来不那么容易


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

好主意,我忘了。但是您如何管理这三种不同的方法呢?那你就需要某种初始命令了,或者?谢谢,我想这正是我需要的。我会仔细研究一下,我试了一下,但是代码有点复杂(虽然我主要是C代码)。与其他语言(客户)的通信可能是用objective-c或c#编写的,这是有问题的。这就是为什么我没有选择XML-RPC。