Connect state

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by z01b, 3 Jan 2008.

  1. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    Есть сервер и клиент, между ними тцп соединение, сервер закрыл соединение, как клиент узнает это не отправляя на сервер пакеты и ожидая ответ?
    //З.Ы. Примеры на делфе или С++ =)
     
    #1 z01b, 3 Jan 2008
    Last edited: 3 Jan 2008
    5 people like this.
  2. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    на уровне сокетов - сделай например вызов recv считай 0 байт и посмотри что возвращает: если ошибку (-1), смотри ее в errno, или в WSAGetLastError() в win32.
    разрыв соединения с другой стороны это ECONNRESET и WSAECONNRESET соответственно.
     
    3 people like this.
  3. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    А зачем тебе это узнавать? Обычно не требуется без посылки/принятия данных
     
  4. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    Для ICQ протокола =)
    ЗЫ ZaCo спс, тему мона закрывать
     
    2 people like this.
  5. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    Если "Сервер"(как программа) закрыл соединение 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 минуты!
     
    #5 Delimiter, 10 Jan 2008
    Last edited: 10 Jan 2008