Почему TClientSocket и TServerSocket устарели и что я должен использовать вместо этого?
Я только начинаю знакомиться с 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 ответа
Устаревший, потому что больше не поддерживается. Они представляют собой сокеты Winsock, поэтому общий внутренний механизм тот же: "Создайте прослушиватель, прослушайте, примите, создайте поток обработчика клиента, передав ему ServerClientSocket, поток клиента читает и записывает потоки".
Возможно, вы можете попробовать просто импортировать компоненты - если у вас есть массивное устаревшее приложение для поддержки, то это, безусловно, путь, если он работает.
Тогда есть и другой способ:((Используйте компоненты Indy или Synapse для создания классов 'TClientSocket' и TServerSocket'с одинаковыми членами, чтобы унаследованное приложение работало без значительных изменений.
Они устарели в пользу розеток Indy.
Тем не менее, сокеты Indy только для блокировки. Если ваша программа использовала блокирующие сокеты, то это нормально, однако если вы используете неблокирующие сокеты, то, насколько мне известно, у вас есть только два варианта:
- использовать нити плюс блокирующие сокеты Indy
- использовать TClientSocket и TServerSocket
Есть компоненты TTcpServer
а также TTcpClient
которые имеют переключение между блокированием и неблокированием. Однако, если вы работаете с ними в неблокирующем режиме, они просто не работают (основные операции не выполняются с WSAEWOULDBLOCK) и обходного пути нет.
Примечание для тех, кто читает это, кто может не знать: даже в последних версиях (как я пишу) вы все равно можете импортировать их в IDE, добавив dclsocketsNNN.bpl
в список пакетов времени разработки. Они есть, просто не активны по умолчанию.
Лично я все еще использую TClientSocket в неблокирующем режиме на производстве, он работает просто отлично (после исправления некоторых ошибок, что возможно благодаря тому, что предоставлен полный исходный код!)