Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];

Вниз

Как узнать что сервер (TServerSocket) закрыл соединение?   Найти похожие ветки 

 
alexEagle   (2003-12-24 15:09) [0]

Где в TClientSocket выполнить обработку принудительного разрыва соединения сервером?


 
Digitman   (2003-12-24 15:11) [1]

т.е. ты этот факт уже определил и не знаешь что бы такого сделать на сей счет ? так ? или - как ?


 
alexEagle   (2003-12-24 15:18) [2]

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


 
Digitman   (2003-12-24 15:50) [3]

быть того не может

если клиент - неблокирующий, то возникнет событие OnDisconnect()

если иначе - вызов любого send/recv-метода приведет к исключению, отражающему тот же факт, что и причина возбуждения события OnDisconnect()

покажи как закрываешь серверное гнездо


 
alexEagle   (2003-12-24 16:05) [4]

А у меня клиент блокирующий, получается никак нельзя?


 
alexEagle   (2003-12-24 16:16) [5]

На сервере делаю Сокет.Клоз


 
alexEagle   (2003-12-24 16:22) [6]

В принципе альтернативно могу прибить именно этого клиента через вызов TCustomWinSocket.Close. Причем на сервер это событие обрабатывается, а вот на клиенте - нет


 
Verg   (2003-12-24 16:23) [7]


> А у меня клиент блокирующий, получается никак нельзя?


При чтении из сокета, получившего событие о закрытии соединения противоположным концом (FIN), получится ситуация "EOF", т.е. recv() вернет 0 (ноль).
select то же отреагирует так, будь то появились данные на чтение, но при попытке чтения recv вернет опять же 0.


 
alexEagle   (2003-12-24 16:31) [8]

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

Кстати, по поводу метода ОнДисконнект, вот выдержка из хелпа:
OnDisconnect occurs after the value of the Active property is set to False, but before the actual connection is closed.
Грубо говоря, работает только в случае закрытия соединения на клиенте. Но ведь как то же можно отлавливать дисконнект для блокирующих сокетов?


 
Digitman   (2003-12-24 16:33) [9]


> alexEagle


если - блокирующий, то - только перехват исключений при вызовах методов приема/передачи


 
Verg   (2003-12-24 16:49) [10]


> но вообще не хотелось бы отлавливать командами состояние
> сервера.


Ты не сосотояние сервера "отлавливаешь", а состояние своего же клиентского сокета.

Или, например, как ты "отлавливаешь" тот момент, когда от сервера пришли данные на твой блокирующий клиентский сокет?
Или тебе не надо принимать данные от сервера?


 
Digitman   (2003-12-24 16:53) [11]


> alexEagle


ты бы сходил что ль сюда

http://book.itep.ru/7/sock_71.htm

многие вопросы сами по себе отпали бы ..


 
alexEagle   (2003-12-24 17:12) [12]

Дело в том что я общаюсь с сервером, а не жду или получаю данные

Происходит это где-то так:
1. Я отсылаю запрос
2. Жду ответ

В кодах это выглядит так:
FSocket.Socket.SendText(strRequest);
strResponse := FSocket.Socket.ReceiveText;

Ктсати, кто-нибудь знает почему при первом выполнении этой команды strResponse пустое?


 
Digitman   (2003-12-24 17:25) [13]


> Дело в том что я общаюсь с сервером, а не жду или получаю
> данные


для случая блок.режима комментирую твою несуразность:


> 1. Я отсылаю запрос


.. и ждешь, пока не выполнится некая send-ф-ция, ставящая текст твоего "запроса" в очередь на передачу


> 2. Жду ответ


.. и ждешь, пока затребованное число байт не будет принято целиком и доступно для считывания


 
Verg   (2003-12-24 17:32) [14]


> Дело в том что я общаюсь с сервером, а не жду или получаю
> данные
>
> Происходит это где-то так:
> 1. Я отсылаю запрос
> 2. Жду ответ


А вам известно, что SendText() - это функция, возвращающая integer значение? Не пробовал анализировать результат (ы) ?

А ReceiveText(), который сводится к вызову recv() ?


 
Digitman   (2003-12-24 17:44) [15]


> А вам известно, что SendText() - это функция


дай бог, чтобы половина местных "экспериментаторов" от ($DELPHI)\Demos\Chat обратила внимание (при чтении хэлпа ?? .. смешно ! ибо - "батонокидание" ..) на то, что sendtext() - это ф-ция ...

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

печально все это(


 
alexEagle   (2003-12-24 17:47) [16]

Да, мне так удобно, а в чем проблема. Да мне надо дождаться полностью ответа от сервера. Но почему первый ответ приходит пустой, причем я его не отсылаю!


 
alexEagle   (2003-12-24 17:52) [17]

Verg © (24.12.03 17:32) [14]
Digitman © (24.12.03 17:44) [15]

Господа, у меня блокирующий сокет, а по сему в хелпе сказано: "SendText returns the number of bytes sent. Note that this may be less than the length of the string S i f the socket is nonblocking.", иначе говоря мне это не нужно.

Если воспользоваться функцией чтения из TWinSocketStream, то как определить размер строки/данных.


 
Rouse_   (2003-12-24 18:02) [18]

Кстати помимо ссылки которую привел Digitman хочу дать еще одну, которую также советую изучить...

http://gem.dpt.ustu.ru/InterNetBook/Contents.htm

Желаю успехов в изучении...


 
Digitman   (2003-12-24 18:04) [19]


> по сему в хелпе сказано


по твоему коду не видно, чтобы ты отнесся к сути "SendText returns.." с полной серьезностью


 
Verg   (2003-12-24 18:05) [20]


> "SendText returns the number of bytes sent. Note that this
> may be less than the length of the string S if the socket
> is nonblocking.", иначе говоря мне это не нужно.


Ты уж извини, но тебе раза три уже сказали, что в блокирующем режиме именно результат, возвращаемый функциями send/recv (на них основаны SendText/ReceiveText) и сигнализирует о состоянии блокирующего сокета. В хелпе не написано про ситуации, когда результаты эти <= 0, а именно такое значение надо интерпретировать как разрыв петли соединения...

If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero.
(С) MSDN

Ну не веришь, значит тебе виднее.


 
alexEagle   (2003-12-24 18:36) [21]

Если у кого-то есть соображения как отловить закрытие в месте отличающемся от приема/передачи данных (т.е. чтобы сработало событие дисконнект) то пожалуйста скиньте мне на мыло sorokin@vikoil.dn.ua или асю 335895388.

А на данных момент меня интресует как определить размер буффера для чтения при использовании потока.


 
Reindeer Moss Eater   (2003-12-24 18:39) [22]

Есть соображение, что "в месте отличающемся от приема/передачи данных" программе должно быть совершенно по барабану есть коннект с сервером или нету этого коннекта.
Как только она начинает читать/передавать данные она вмиг узнает об этом.


 
alexEagle   (2003-12-24 18:50) [23]

Соображение не подходит, оператор должен видет что соединение отсутствует


 
Reindeer Moss Eater   (2003-12-24 18:52) [24]

Значит программа должна постоянно читать/писать.


 
alexEagle   (2003-12-24 19:28) [25]

Кстати, а кто знает как опросить состояние сокета в делфи?
Я слыхал в АПИ есть нечто вроде ioctl для этого случая, но примера найти не смог.


 
Rouse_   (2003-12-25 02:37) [26]

> Если у кого-то есть соображения как отловить закрытие в
> месте отличающемся от приема/передачи данных


В блокирующем режиме никак...

Ссылки все приведены...

PS: Дальнейший разговор без рассмотрения приведенных ответов приведет к закрытию ветки...



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

Форум: "Сети";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.014 c
9-93745
wild
2003-08-15 04:35
2004.02.29
Математика в азартных играх.


1-93861
Maxio
2004-02-16 16:33
2004.02.29
После точки


14-94185
slivka
2004-02-06 23:20
2004.02.29
А что такое


1-93987
$tranger
2004-02-17 11:59
2004.02.29
ListView и табличные данные


14-94167
mfender
2004-02-07 18:49
2004.02.29
Индульгенция





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский