Главная страница
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.015 c
7-86191
vidiv
2002-10-23 09:12
2002.12.26
Sound - NoSound beginer1 help me


7-86189
Sirus
2002-10-23 07:58
2002.12.26
Насчет принтера... Как можно узнать???


7-86200
ocean
2002-10-21 19:44
2002.12.26
Версия Windows


4-86234
Maksss
2002-11-11 00:05
2002.12.26
Не Могу отловить ивенс


3-85823
maxx2000
2002-12-06 13:23
2002.12.26
Foreign Key for Paradox