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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 27 мая 2011

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

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

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

0 голосов
/ 15 мая 2014

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

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

  • использовать потоки плюс блокирующие сокеты Indy
  • использовать TClientSocket и TServerSocket

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

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

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

...