ios SIGPIPE로 인한 붕괴를 어떻게 해결합니까

830 단어
ios 장거리 연결 게임을 개발하는 과정에서 문제가 발생했습니다. 게임이 실행되는 과정에서 유저가 홈 버튼을 누르거나 다른 원인으로 게임이 끊기면 socket 연결이 끊어지지 않습니다. 서버는 자원을 절약하기 위해 일정 시간 후에 이 연결을 자발적으로 닫습니다.유저가 다시 게임으로 자른 후, 앞부분은 이 연결이 끊어진 것을 모르고 끊긴 socket을 통해 메시지를 계속 보냅니다. 이 때send 함수는 SIGPIPE 이상을 촉발하여 프로그램이 붕괴됩니다.
이 문제를 해결하려면send에서 서버가 연결을 닫고 다시 연결하는 것을 감지해야 합니다.정상적인 상황에서send 함수 반환-1은 발송에 실패했음을 나타냅니다. 그러나 IOS에서 SIGPIPE는send가 되돌아오기 전에 프로세스를 종료했습니다. 따라서 SIGPIPE를 무시하고send가 정상적으로 -1로 되돌아오게 한 다음에 서버를 다시 연결해야 합니다.
자료를 찾아본 후 두 가지 방법을 찾았다.
1) 시그널(SIGPIPE, SIG_IGN)을 사용하여 SIGPIPE를 무시합니다.실험을 통해 ios7 시뮬레이터에서 xcode는 SIGPIPE를 포획하지만 프로그램이 붕괴되지 않고 계속 실행될 수 있습니다.하지만 진짜 기계에서는 여전히 붕괴된다.
2) SO_ 사용NOSIGPIPE. 실험을 통해 여러 ios 버전에서 더 이상 SIGPIPE를 터치하지 않고 문제를 완벽하게 해결했다.
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

좋은 웹페이지 즐겨찾기