Время ожидания отправки сокета Erlang никогда не происходит - PullRequest
2 голосов
/ 01 декабря 2010

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

Я использовал эту опцию прослушивания на сервере:

[{certfile, "cert.pem"},   
 {keyfile, "key.pem"},
 {reuseaddr, true},   
 {active, false},
 {send_timeout, 10000}]

После того, как я установил соединение между сервером и мобильным телефоном, я переключаю телефон в режим полета (который отключает все беспроводные сигналы) и выполняю отправку ssl: на сервер.Функция отправки happliy вернулась нормально, как будто пакет успешно передан.

Что я сделал не так?

1 Ответ

2 голосов
/ 01 декабря 2010

Вы установили параметр {send_timeout_close, true} для сокета из inet? Если нет, сокет не будет закрыт, просто верните обратно ошибку тайм-аута. Также существует риск ssl проглотить вашу ошибку и что-то с ней сделать.

Некоторые другие пункты:

  • Не забудьте проверить возвращаемое значение любых параметров ssl:send и ssl:receive на наличие ошибок. Важно знать, что отправка прошла успешно.

    ok = ssl:send(Sock, Data),
    
  • Базовый стек TCP / IP может фактически принимать данные даже при установленном send_timeout, но не сможет отправить его, так как другая конечная точка не работает. Знание закрытого порта сначала приходит позже, когда стек понимает, что он никогда не получал ACK.

  • Существует тип записи raw для сокетов, определенный в inet. Это позволяет вам устанавливать параметры сокета для конкретной ОС. Может быть возможно заставить ОС быть более агрессивной при обнаружении потери соединения.

  • Другим вариантом является отслеживание всего вызова ssl:recv/3, когда тайм-аут означает потерю устройства, независимо от состояния его сокета. Он также имеет преимущество обнаружения проблем приложения на другом конце, поскольку он не продвигается по определенному пути. В любом случае вам придется сделать это для обработки дальнейших запросов.

  • Также может действовать клиент мобильного телефона. Если он отправляет сообщение по SSL, а прием не приходит (из-за режима полета) - значит, он знает, что что-то не так. Однако сервер может не знать об этом.

  • TCP / IP обеспечивает надежный, ориентированный на соединение потоковый протокол. Он не защищает от внезапных отключений. Это важно, так как ваш протокол должен решить проблему отключения. Это особенно важно, если в вашем протоколе есть какое-либо подтверждение или подтверждение.

...