Arhn - архитектура программирования

Socet recv зависает при сбое сервера

Я работаю над клиент-серверной программой, использующей сокеты в Windows и MAC, и в настоящее время сталкиваюсь с проблемой, когда клиентский вызов recv блокируется навсегда, когда серверная программа выходит из строя / завершается с помощью диспетчера задач. Я отправляю данные на сервер и асинхронно жду ответа, используя recv. Этот ответ придет с сервера через некоторое время, которое не может быть определено. Я ожидал ошибки от recv, когда умирают другие концы сокета. Не знаю, как справиться с этой ситуацией.

Предложения ?

Спасибо,

10.12.2014

Ответы:


1

Установите тайм-аут чтения с помощью setsockopt() и параметра SO_RCVTIMEO, установив для него какое-нибудь разумное значение.

10.12.2014
  • Или используйте _1 _ / _ 2 _ / _ 3_ для ожидания входящих данных с тайм-аутом и вызовите recv() только в том случае, если что-то действительно ожидает чтения (что включает в себя плавное закрытие в конце потока одноранговым узлом). 11.12.2014

  • 2

    Ваш recv не должен зависать (а вместо этого указывать на закрытое соединение), если вы используете TCP и одноранговый сокет правильно закрывается, и если связь между обеими системами работает (нет сломанного кабеля и т. Д.). В UNIX сокет должным образом закрывается ядром, даже если процесс вылетает из строя или прекращается, но я не знаю о поведении Windows в этом случае.

    recv все равно будет зависать, если вы используете UDP для связи, потому что нет явного закрытия соединения.

    10.12.2014
  • Вы должны увидеть конец потока, а не ошибку. Но возможен отказ отправляющего хоста, так что даже он не будет отправлен. 10.12.2014
  • Да, но главное, чтобы recv больше не зависал. И да, отправляющий хост может полностью выйти из строя, но в этом случае связь между обеими системами больше не будет работать. Если хост вышел из строя, закрытие сокета не будет выполнено, и если хосты снова появятся позже, он не будет знать ни о каких сокетах, которые могут быть открыты на другом конце. Существуют такие вещи, как таймауты или so_keepalive, которые могут использоваться для обнаружения этого, но на данный момент даже не ясно, использует ли OP вообще TCP для связи (таймауты, конечно же, будут работать и с UDP). 10.12.2014
  • «одноранговый сокет правильно закрывается» - я думаю, что ОП больше беспокоит случай, когда этого не происходит. В таких случаях результатом по умолчанию с TCP является то, что полузакрытое соединение зависает навсегда, ожидая данных, которые никогда не поступят. 10.12.2014
  • По крайней мере, в UNIX сокет должным образом закрывается, даже если процесс завершается, что беспокоит OP. Как я уже сказал, я не знаю, ведет ли Windows то же самое, но я действительно ожидал этого. Опять же - очень сложно строить предположения, пока мы даже не знаем, какой протокол связи (TCP, UDP) использует OP. 10.12.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..