【问题标题】:Why are TClientSocket and TServerSocket deprecated and what should I use instead?为什么不推荐使用 TClientSocket 和 TServerSocket,我应该改用什么?
【发布时间】:2011-05-27 07:59:15
【问题描述】:

在经历了 Eclipse、Emacs、Visual Studio 和记事本的生活之后,我才刚刚开始熟悉 Embarcadero RAD Studio 2010 :)

我正在进入一个相当大的 C++ 应用程序(500.000 - 1.000.000 行),我发现它广泛使用了 TClientSocket 和 TServerSocket。 IDE 首先抱怨找不到 TClientSocket 但仍然可以编译,我挠了挠头。然后我发现它不再默认安装,并且自很久以前就被标记为已弃用。

我已尝试阅读有关该主题的信息,但没有找到太多信息。我的问题是

  • 为什么不推荐使用 TClientSocket 和 TServerSocket?
  • 它们与 WinSock 和 BSD 套接字的工作方式有何不同?
  • 最好使用什么来代替,是否有一种快速替代方法,不涉及遍历整个应用程序并在使用 TClientSocket 和 TServerSocket 的任何地方进行更改?我猜这主要是内部运作发生了变化还是?

【问题讨论】:

    标签: c++ c++builder c++builder-2010 tclientsocket


    【解决方案1】:

    已弃用,因为不再受支持。它们是 Winsock 套接字的封装,因此整体内部机制是相同的——“创建侦听器、侦听、接受,创建客户端处理程序线程,将 ServerClientSocket 传递给它,客户端线程读取和写入流”。

    您也许可以尝试只导入组件 - 如果您有一个庞大的遗留应用程序需要支持,那么这肯定是可行的方法。

    然后还有另一种方式 :(( 使用 Indy 或 Synapse 组件构建具有相同成员的“TClientSocket”和 TServerSocket 类,以便旧版应用程序无需大量更改即可工作。

    【讨论】:

    • 是的,我已经安装并导入了组件,因此应用程序可以正常编译和运行。但是根据弃用的原因,使用 indy 或 synapse 创建一个包装类可能是和想法
    【解决方案2】:

    它们已被弃用,取而代之的是 Indy 套接字。

    但是,Indy 套接字是仅阻塞的。如果您的程序使用阻塞套接字,那么这很好,但是如果您使用非阻塞套接字,那么据我所知,您只有两个选择:

    • 使用线程和阻塞 Indy 套接字
    • 使用 TClientSocket 和 TServerSocket

    有组件TTcpServerTTcpClient 在阻塞和非阻塞之间切换。但是,如果您在非阻塞模式下操作它们,它们就不起作用(基本操作因 WSAEWOULDBLOCK 失败)并且没有解决方法。

    对于其他阅读本文但可能不知道的人请注意:即使在最新版本中(如我所写),您仍然可以通过将 dclsocketsNNN.bpl 添加到设计时包列表中来将它们导入 IDE。它们在那里,只是默认情况下不活动。

    我个人仍然在生产中以非阻塞模式使用TClientSocket,它工作得很好(在修复了一些错误之后,这可能要归功于提供了完整的源代码!)

    【讨论】:

    • 你有这些“修复”吗?可能会解决我们有时会看到的一些旧的奇怪错误:)
    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2016-08-22
    • 2013-08-07
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多