Самопроизвольное отключение клиентского сокета сразу после коннекта к серверу

Тема в разделе "WASM.WIN32", создана пользователем ACF_muti1atoR, 24 май 2006.

  1. ACF_muti1atoR

    ACF_muti1atoR New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    30
    Адрес:
    Провода
    Короче вот столкнулся с таким глюком:



    сервер вызывает accept

    клиент вызывает connect

    сервер возвращает accept всё ок

    у клиента connect тоже возвращает всё ок



    далее идёт recv данных с этого клиента.



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



    А у клиента в свою очередь recv ничего не возвращает! а ждёт!. т.е. клиент уверен, что он подключён к серверу, а серверный recv почему-то решил, что клиент разорвал соединение.



    вот и я не могу понять в чём дело. может 50 раз пройти подключение нормально, и на 51 почему-то сервер рубит клиента сам.



    Да при этом WSAGetlasterror после того как серверный recv вернул -1 говорит, что ошибок-то и нет никаких!
     
  2. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Чёт ты все запутал... Как я понял у тебя и клиент и сервер вызывают recv? Зачем? Может лучше на сервере recv, а на клиенте send? =))) На сервере recv возвращает -1 не потому, что обрыв связи, а потому, что данные не смог получить - клиент-то тоже их получет в это время (вот тебе откуда 1 из 10)
     
  3. ACF_muti1atoR

    ACF_muti1atoR New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    30
    Адрес:
    Провода
    что значит "зачем recv"? 8) recv у обоих запущен в отдельном потоке, потому что они общаються между собой постоянно.



    send естественно у обоих тоже есть.



    recv на сколько я знаю не возвращает управление до тех пор, пока не получит либо данные посланные sendом, либо сигнал о том, что клиент отключился. и всё. Как бы иначе по всем законам msdn он не может вернуть -1 пока я шнур из разетки не выдерну 8).



    так же яиспользую TCP протокол по этому коллизий быть не может.