为什么不赞成使用TClientSocket和TServerSocket,我应该使用什么呢?

时间:2011-05-27 07:59:15

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

我在Eclipse,Emacs,Visual Studio和记事本生活之后开始熟悉Embarcadero RAD Studio 2010:)

我跳进了相当大的C ++应用程序(500.000 - 1.000.000行),我发现它广泛使用了TClientSocket和TServerSocket。 IDE首先弄清楚TClientSocket没有找到,但仍然可以编译,我挠了挠头。然后我发现它不再默认安装,并且自返回后被标记为已弃用。

我试图阅读有关该主题但未找到太多信息。我的问题是

  • 为什么不推荐使用TClientSocket和TServerSocket?
  • 它们与WinSock和BSD套接字的功能有何不同?
  • 最好使用什么,是否有一个快速替换,不涉及通过整个应用程序和更改TClientSocket和TServerSocket正在使用?我猜这主要是内部工作已经改变了吗?

2 个答案:

答案 0 :(得分:3)

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

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

然后是另一种方式:(使用Indy或Synapse组件来构建具有相同成员的TClientSocket'和类,以便遗留应用程序无需大量更改即可运行。

答案 1 :(得分:0)

他们已被弃用,支持Indy套接字。

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

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

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

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

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