Почему TClientSocket и TServerSocket устарели и что я должен использовать вместо этого?

#c #c builder #c builder-2010 #tclientsocket

#c #c builder #c builder-2010 #tclientsocket

Вопрос:

Я только начинаю знакомиться с Embarcadero RAD Studio 2010 после того, как пожил в Eclipse, Emacs, Visual Studio и notepad 🙂

Я перехожу к довольно большому приложению на C (500.000 — 1.000.000 строк), в котором, как я обнаружил, широко использовались TClientSocket и TServerSocket. IDE сначала пожаловалась на то, что TClientSocket не был найден, но все еще мог компилироваться, и я почесал голову. Затем я узнал, что он больше не установлен по умолчанию и с давних пор помечен как устаревший.

Я пытался прочитать об этом предмете, но не нашел много информации. Мои вопросы

  • Почему TClientSocket и TServerSocket устарели?
  • Чем они отличаются по способу работы от сокетов WinSock и BSD?
  • Что было бы лучше использовать вместо этого и есть ли быстрая замена, которая не включала бы просмотр всего приложения и изменение везде, где используются TClientSocket и TServerSocket? Я бы предположил, что в основном изменилась внутренняя работа или?

Ответ №1:

Устарело, потому что больше не поддерживается. Они представляют собой набор сокетов Winsock, поэтому общий внутренний механизм тот же — «Создать прослушиватель, прослушать, принять, создать поток обработчика клиента, передав ему ServerClientSocket, клиентский поток считывает и записывает потоки».

Возможно, вы могли бы попробовать просто импортировать компоненты — если у вас есть массивное устаревшее приложение для поддержки, то это, безусловно, правильный путь, если это работает.

Тогда есть другой способ : (( Используйте компоненты Indy или Synapse для создания классов TClientSocket и TServerSocket с идентичными элементами, чтобы устаревшее приложение работало без значительных изменений.

Комментарии:

1. Да, я установил и импортировал компоненты, поэтому приложение компилируется и работает нормально. Но в зависимости от причины устаревания может возникнуть идея создать класс-оболочку с использованием indy или synapse

Ответ №2:

Они устарели в пользу Indy-сокетов.

Однако сокеты Indy предназначены только для блокировки. Если ваша программа использовала блокирующие сокеты, то это нормально, однако, если вы используете неблокирующие сокеты, то, насколько я знаю, у вас есть только два варианта:

  • используйте потоки плюс блокировку инди-сокетов
  • используйте TClientSocket и TServerSocket

Существуют компоненты TTcpServer и TTcpClient , которые имеют переключатель между блокировкой и неблокирующим. Однако, если вы используете их в неблокирующем режиме, они просто не работают (основные операции завершаются ошибкой с WSAEWOULDBLOCK) и обходного пути нет.

Примечание для всех, кто еще читает это и, возможно, не в курсе: даже в последних версиях (как я пишу), вы все еще можете импортировать их в IDE, добавив dclsocketsNNN.bpl в список пакетов разработки. Они есть, просто не активны по умолчанию.

Лично я все еще использую TClientSocket в неблокирующем режиме в рабочей среде, он работает просто отлично (после исправления некоторых ошибок, что возможно благодаря тому, что предоставляется полный исходный код!)

Комментарии:

1. Доступны ли у вас эти «исправления»? Может решить некоторые из старых странных ошибок, которые мы иногда видим 🙂