为什么不推荐使用TClientSocket和TServerSocket,我应该使用什么
Why are TClientSocket and TServerSocket deprecated and what should I use instead?
在经历了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
存在具有在阻塞和非阻塞之间切换的组件TTcpServer
和TTcpClient
。然而,如果您在非阻塞模式下操作它们,它们就不起作用(WSAEWOULDBLOCK的基本操作失败),并且没有解决方法。
请注意,阅读本文的其他人可能不知道:即使在最新版本中(正如我所写的),您仍然可以通过将dclsocketsNNN.bpl
添加到设计时包列表中来将它们导入IDE。它们在那里,只是默认情况下不活动。
就我个人而言,我仍然在生产中以非阻塞模式使用TClientSocket,它工作得很好(在修复了一些错误之后,这是可能的,因为提供了完整的源代码!)
- 我应该使用什么来代替void作为变体中的替代类型之一
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 违反const正确性:我应该现实地期待什么问题
- 我应该包含什么来制作 boost.python 扩展?
- 我应该将什么传递给glfwSetWindowSizeCallback?
- 我应该在 main 函数中写什么来测试我的问题?
- 我应该返回什么而不是标准::shared_ptr<>&?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 在从 C++ 转换为 C# 的代码中,我应该使用什么而不是 memcpy?
- C++我应该用什么来保存格式化为字符串变量(如sprintf())的文件
- 我应该使用什么信号来终止/终止Windows上的应用程序
- 为什么我应该在scanf()-家族成员中包含一个长度修饰符作为参数?有什么好处?使用长度修改器进行扫描的作用
- 我应该在服务模板中的什么位置添加自己的代码?
- mfc CEdit 我应该什么时候进行验证?
- 在使用 boost 共享互斥体时,我应该在什么情况下使用 owns_lock() 函数
- 操纵器,C 我应该使用什么顺序
- 我应该什么时候使用(!somevar)vs essert()
- 我应该什么时候使用 *,什么时候使用 &?
- 我应该什么时候通过 T const& 返回?
- 我应该什么时候传递"T* const&"类型的指针?