Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.26;
Скачать: CL | DM;

Вниз

Сокеты   Найти похожие ветки 

 
VirginKiller ©   (2002-10-30 11:28) [0]

Есть два компонента: ClientSocket и ServerSocket. ServerSocket.ServerType = stThreadBlocking, у клиента тоже самое. Проблема в том, что при выполнении ClientSocket.Close (Active := False) в приложении клиенте цикл while (not terminated) and ClientSocket.Connected в ClientExecute процесса сервера продолжает выполняться, т.е. ClientSocket.Connected не реагирует на ручное отключение клиента. Как бы это можно было побороть?


 
Digitman ©   (2002-10-30 11:36) [1]

1. TClientSocket не имеет св-ва stThreadBlocking.
2. Тело ClientExecute() должно само устанавливать св-во ClientSocket.Connected = False при возникновении исключительных ситуаций , связанных с отказом трансаорта из-за разрыва соединения по инициативе клиента


 
virginkiller ©   (2002-10-30 12:08) [2]

1. Ну да, там просто stBlocking.
2. Хорошо, а как узнать, что клиент отсоединился, если в это время ничего не передается?


 
Digitman ©   (2002-10-30 12:29) [3]

А как вообще ты узнаешь, что "в это время" что-то "передается" ?


 
VirginKiller ©   (2002-10-30 12:58) [4]

:-) Хорошо. Рассмотрим ситуацию, которую я в начале описывал - тело ClientExecute имеет только цикл. Клиент подключился, процесс создался, все замечательно.. И клиент отключается. Как узнать, что он отключился?


 
Digitman ©   (2002-10-30 13:09) [5]

А зачем такой цикл нужен ? Пустой ?)
В нем должны быть вызовы различных транспортно-диспетчерских ф-ций гнезда сервера, ассоциированного с данным коннектом

Если коннект по каким-то причинам разорван, то ф-ции возвращают отказ, который и нужно анализировать, и по результатам анализа выполнять ClientSocket.Connected = False (если код отказа фиксирует факт невозможности дальнейшей работы с транспортным каналом)


 
VirginKiller ©   (2002-10-30 14:02) [6]

Понятно.. :-) Хорошо, а не подскажешь, как лучше решить проблему обмена информацией в оба направления одновременно. Я пока думаю, клиентом подключаться сразу двумя сокетами и при коннекте говорить, кто он такой и какой сокет для чего. Может, есть решение лучше, для меня эта тема вообще темный лес. :-)


 
Digitman ©   (2002-10-30 14:18) [7]


> клиентом подключаться сразу двумя сокетами


Ни к чему это. После того, как клиент и сервер достоверно установили соединение, в каждый момент времени кадый из них может являться как приемником, так и передатчиком сообщений (вне зависимости, кто из них кто).
Для передачи сообщений используются Send-методы объекта TCustomWinSocket, для приема - Receive-методы.


 
VirginKiller ©   (2002-10-30 14:33) [8]

Но могут ли они одновременно и посылать и принимать?


 
Digitman ©   (2002-10-30 14:45) [9]

Опять же - ни к чему это.
Достаточно установить асинхронный неблокирующий режим работы гнезда



Страницы: 1 вся ветка

Текущий архив: 2002.12.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
3-85872
antoniz
2002-12-04 09:38
2002.12.26
Подскажите по переиндексации в Paradox.


14-86157
AM
2002-12-06 11:28
2002.12.26
Может кто-нибудь знает....


1-86010
snake1977
2002-12-16 13:29
2002.12.26
TMemo и ограничения


14-86172
VictorT
2002-12-06 21:51
2002.12.26
Задачка :)


4-86229
Cosmic
2002-11-10 16:49
2002.12.26
Как в консоли сделать таймер?