为什么不推荐使用TClientSocket和TServerSocket,我应该使用什么

Why are TClientSocket and TServerSocket deprecated and what should I use instead?

本文关键字:我应该 什么 TServerSocket TClientSocket 为什么不      更新时间:2023-10-16

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

我正在跳到一个相当大的C++应用程序(500000-1.000.000行)中,我发现它广泛使用了TClientSocket和TServerSocket。IDE第一次抱怨TClientSocket找不到,但仍然可以编译,我挠头了。然后我发现它不再默认安装,并且从很久以前就被标记为不推荐使用。

我试着读过关于这个主题的书,但没有找到太多信息。我的问题是

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

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

你可以尝试只导入组件——如果你有一个庞大的遗留应用程序需要支持,那么如果它有效的话,这肯定是一条路。

还有另一种方法:(使用Indy或Synapse组件构建具有相同成员的"TClientSocket"answers"TServerSocket"类,这样遗留应用程序就可以在没有大规模更改的情况下运行

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

然而,Indy插座只是阻塞。如果你的程序使用了阻塞套接字,那么这是可以的,但是如果你使用的是非阻塞套接字,据我所知,你只有两个选项:

  • 使用螺纹加阻塞Indy插座
  • 使用TClientSocket和TServerSocket

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

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

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