Как обнаружить потерянное соединение TCP? - PullRequest
3 голосов
/ 22 января 2011

У меня есть кроссплатформенный код, который я написал на уровне сокетов для Linux и iPhone. Он открывает неблокирующие сокеты и подключается к серверу. Все работает отлично, за исключением иногда, когда один из клиентов / серверов отключается, он останавливает exec через SIGPIPE на другом во время вызова recv или send.

Это имеет смысл. В Linux я могу использовать флаг, чтобы указать операционной системе lib не поднимать SIGPIPE - тогда я могу почувствовать ошибку и обработать ее аккуратно. Это прекрасно работает

Однако в iPhone OS (и, вероятно, в osx, о котором я позже забочусь) нет флага, который бы указывал не выбрасывать SIGPIPE. Я могу сделать сигнал (SIGPIPE, IGN); который, кажется, обычно останавливает это, но все же иногда я получаю это ??? (Это может быть связано с тем, где я установил обработку этого сигнала - я могу делать это только при запуске приложения, и вместо этого мне, возможно, придется делать это каждый раз, когда приложение становится активным ??)

Все это заставляет меня чувствовать, что я ловлю разъединение неправильным способом - должен ли я использовать select () или друзей, чтобы определить, произошло ли разъединение ?? В частности, как я могу это сделать?

1 Ответ

1 голос
/ 23 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...