#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. Доступны ли у вас эти «исправления»? Может решить некоторые из старых странных ошибок, которые мы иногда видим 🙂