在西雅图 C++ Builder 10 中使用 Web.Win.Sockets

Posted

技术标签:

【中文标题】在西雅图 C++ Builder 10 中使用 Web.Win.Sockets【英文标题】:Using Web.Win.Sockets in C++ Builder 10 Seattle 【发布时间】:2015-10-21 10:32:00 【问题描述】:

我有一个现有的(大型)项目,最初是使用 C++ Builder 2010 构建的。它使用现已弃用的套接字进行通信。

我read 说它们在示例项目中仍然可用,并从命令行构建它。我从 Component/Install Packages 导航到示例文件夹中的 bpl 并安装它,然后继续尝试运行代码。但我感觉少了一些步骤。

从示例文件夹中包含 Web.Win.Sockets.hpp 似乎还不够。它似乎不包含关于很多东西的定义,例如现有代码使用的 TServerSocket 等。 System.Win.ScktComp 似乎包含这些缺失的定义,但将两者混合似乎不是正确的做法。只是为了好玩,我曾经尝试过类似的一些疯狂的事情并让它编译,但传输的数据似乎包含破坏通信的垃圾。

有一次我尝试转而使用 System.Win.ScktComp 中的组件,但没有关于什么与什么相关以及是否有任何警告的好信息。在我得到程序编译后,它将无法连接等。

那么,对于 C++ Builder 10 Seattle 启用和使用“旧”套接字有什么好的指南吗?如果要搬到新的,是更换的减少还是需要大量的工作?系统以自定义二进制格式传输大量数据,因此完成了大量流处理等。现在我需要启动并运行它,因此目前无法对这些部分进行大量重写。

【问题讨论】:

【参考方案1】:

Web.Win.SocketsSystem.Win.ScktComp 不是同一个东西,也不是相互替代的。

System.Win.ScktComp 包含旧的 VCL 套接字组件(TClientSocketTServerSocket 等)。这就是你想要的。

Web.Win.Sockets 包含旧的 CLX 套接字组件(TTcpClientTTcpServer 等)。你不想要这个,所以忽略示例项目,你不需要它。

要获取 VCL 套接字组件,您需要做的就是安装 dclSockets 软件包,该软件包位于您的 $(BDS)\bin 文件夹中,如文档所述:

Installing Socket Components

默认情况下不安装套接字组件。要使用套接字组件,您必须安装 dclsockets<.bpl> 包。

安装插座组件:

    选择组件>Install Packages。 在安装包对话框中,单击添加。 在添加设计包对话框中,浏览至C:\Program Files (x86)\Embarcadero\Studio\17.0\bin。 选择 dclsockets230.bpl,然后单击打开。 单击“确定”关闭安装包对话框。 套接字组件(TClientSocket 和 TServerSocket)列在 Tool PaletteInternet 类别中。

注意:这些步骤是一次性安装说明。套接字组件应该可用于所有未来的项目。

如果您以后想将代码切换到不同的套接字组件,则必须相应地重新编写套接字代码。

【讨论】:

不知何故我就知道你会回答的。每当我最终得到 RAD Studio 或 C++ Builder 问题的答案时,就是你 :)。非常感谢您的努力。有点遗憾的是,它不像 Visual C++ 那样容易获得大量反馈。无论如何,由于某种原因,他们似乎在代码中同时使用了 TServerSocket 和 TTcpServer 。据我所见,在设置端口以检查它是否可用时,似乎使用了 TTcpServer 。它开始监听它,然后如果 Listening 为 false 则抛出错误,如果为 true,则将 active 设置为 false。 Seattle 和 2010 附带的 dclsockets 版本是否存在“任何”差异?通信在接收和消化时似乎有额外的数据。没有真正好的方法来调试和查看发送的数据以及它在 IDE 中包含的内容。一些流的可视化工具或其他东西会非常适合这个。 我发现了一段代码,它应该获取几乎全部的字符串数据并“按原样”呈现,它向我展示了很多日文字符。所以我会本能地说编码搞砸了。但是由于代码中没有任何变化,我想知道在处理 sin 2010 的字符串中是否有任何变化?大多数 AnsiStrings 是在内部使用的。 代码不应将TServerSocketTTcpServer 混合在一起。没有理由使用TTcpServer 来检查端口可用性,TServerSocket 可以做同样的事情。在任何情况下,套接字组件都不能正确处理 Unicode 字符串。如果您看到类似日语的字符,则肯定是编码不匹配。我不建议在 D2009 以后使用 SendText()ReceiveText() 方法,最好直接使用 SendBuf()ReceiveBuf() 并在代码中手动处理字节字符串转换。 是的,我确实重写了检查空闲套接字的代码以改用 TServerSocket。您提到的用于发送文本的功能未使用。相反,我使用 TStream 的 WriteBuffer 写入底层数据的 AnsiString 和其他类型的重载流运算符。仔细观察,当我签入重载的流运算符时,正确的数据似乎已写入流并由客户端接收。但不知何故,一旦它通过系统传播,以前有效的代码现在必须以某种方式破坏它。

以上是关于在西雅图 C++ Builder 10 中使用 Web.Win.Sockets的主要内容,如果未能解决你的问题,请参考以下文章

如何使 id3lib 在 C++ Builder 10.2 中工作?

Embarcadero C++ builder 10.4.2-附加到进程在 64 位上不起作用

在 Delphi / C++ Builder 中使用 WebView (EdgeHTML)

如何检测 C++ Builder 10.4 / Android 应用程序中的泄漏

C++ Builder如何用向量构建动态对象?

在 C++ Builder 中使用带有 BLOB 字段的图像和数据