У меня есть кроссплатформенный код, который я написал на уровне сокетов для Linux и iPhone. Он открывает неблокирующие сокеты и подключается к серверу. Все работает отлично, за исключением иногда, когда один из клиентов / серверов отключается, он останавливает exec через SIGPIPE на другом во время вызова recv или send.
Это имеет смысл. В Linux я могу использовать флаг, чтобы указать операционной системе lib не поднимать SIGPIPE - тогда я могу почувствовать ошибку и обработать ее аккуратно. Это прекрасно работает
Однако в iPhone OS (и, вероятно, в osx, о котором я позже забочусь) нет флага, который бы указывал не выбрасывать SIGPIPE. Я могу сделать сигнал (SIGPIPE, IGN); который, кажется, обычно останавливает это, но все же иногда я получаю это ??? (Это может быть связано с тем, где я установил обработку этого сигнала - я могу делать это только при запуске приложения, и вместо этого мне, возможно, придется делать это каждый раз, когда приложение становится активным ??)
Все это заставляет меня чувствовать, что я ловлю разъединение неправильным способом - должен ли я использовать select () или друзей, чтобы определить, произошло ли разъединение ?? В частности, как я могу это сделать?