Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Connect state (https://forum.antichat.xyz/showthread.php?t=57217)

z01b 03.01.2008 04:04

Connect state
 
Есть сервер и клиент, между ними тцп соединение, сервер закрыл соединение, как клиент узнает это не отправляя на сервер пакеты и ожидая ответ?
//З.Ы. Примеры на делфе или С++ =)

ZaCo 03.01.2008 04:33

на уровне сокетов - сделай например вызов recv считай 0 байт и посмотри что возвращает: если ошибку (-1), смотри ее в errno, или в WSAGetLastError() в win32.
разрыв соединения с другой стороны это ECONNRESET и WSAECONNRESET соответственно.

_Great_ 03.01.2008 13:58

А зачем тебе это узнавать? Обычно не требуется без посылки/принятия данных

z01b 03.01.2008 15:13

Цитата:

Сообщение от _Great_
А зачем тебе это узнавать? Обычно не требуется без посылки/принятия данных

Для ICQ протокола =)
ЗЫ ZaCo спс, тему мона закрывать

Delimiter 10.01.2008 01:46

Если "Сервер"(как программа) закрыл соединение TCP будет послан либо пакет с флагом RST
либо пакет с флагом FIN.... все зависит от того как реализована схема на сервере, если она не реализована а кто-то просто вырубает серверное приложение то будет послан Ws2_32.dll пакет с флагом RST.


единственный путь достичь отсутствие пакета о закрытии это взять и вытащить сетевой
кабель из компа где запущено серверное приложение.
(но это для шутникоффф :) )

Едиственно что тебе нужно обрабатывать FD_CLOSE, на асинхронных сокетах
это делается выставлением ....

int err=WSAAsyncSelect(socket,hWnd,TCPconst,FD_READ|FD _CLOSE);
я данной функцией просто говорю что формировать для моего приложения сообщение
с номером TCPconst которую свяжу с функцией обработчиком
( будут приходить
FD_READ-все пакеты прочитанные сокетом
FD_CLOSE-пакеты закрытия )


и в функции обработчике прооверять
if(WSAGETSELECTEVENT(lParam)==FD_CLOSE)
{
// vot tut i budet zakritie so storoni servera
}


.... обычно встает обратная задача как серверу знать
клиент жив или мертв(ведь пути "клиента" неисповедимы) к примеру вытащите кабель сетевой или вырубите "мопед" , позвоните другу и спросите "А я еще в Аське?" ... не сомневайтесь ответит Да!

А потому схема ICQ реализована путем посылки "эдаких пингов от клиента серверу с ответами
00:15:41.681642 len:64 192.168.1.16:3430 -> 205.188.8.145:5190 (TCP)---AU
__________________________________________________ _________________
IP: IP-Version:4
Prioruty:normal
TTL: 128
Protocol: TCP
TCP: ACK Number: 3766973462
SEQ Number: 3489220673
Window: 30459

__________________________________________________ _________________
00 13 49 B3 1E E2 00 90 F5 51 9F B2 08 00 45 00 | .I³â.�õQŸ²..E.
00 32 EC 0A 40 00 80 06 76 B5 C0 A8 01 10 CD BC | .2ì.@.?.VµÀ¨.ͼ
08 91 0D 66 14 46 41 48 F9 CF 16 74 87 E0 50 18 | .‘.FFAHùÏT‡àP
FB 76 C0 26 00 00 2A 05 36 0F 00 04 00 00 00 EE | ûVÀ&..*.6......î
|


ВОТ ТАКИХ! И ответов

00:15:41.825488 len:60 205.188.8.145:5190 -> 192.168.1.16:3430 (TCP)----U
__________________________________________________ _________________
IP: IP-Version:4
Prioruty:normal
TTL: 110
Protocol: TCP
TCP: ACK Number: 3656992833
SEQ Number: 3766973462
Window: 64

__________________________________________________ _________________
00 90 F5 51 9F B2 00 13 49 B3 1E E2 08 00 45 00 | .�õQŸ².I³â..E.
00 28 E3 A2 40 00 6E 06 91 27 CD BC 08 91 C0 A8 | .(ã¢@.N.‘'ͼ.‘À¨
01 10 14 46 0D 66 16 74 87 E0 41 48 F9 D9 50 10 | .F.FT‡àAHùÙP
40 00 DC AB 00 00 00 00 00 00 00 00 | @.Ü«........


Разница по времени между пингами 4 минуты!


Время: 03:24