Nektarios
Nektarios

Reputation: 10351

How to detect TCP connection lost?

I have crossplatform code I've written at the socket level on Linux and iPhone. It opens nonblocking sockets and connects to a server. Everything works great except sometimes when one of the client/server disconnects it halts exec via SIGPIPE on the other during a recv or send call.

That makes sense. On Linux I can use a flag to indicate to the OS lib not to raise SIGPIPE - then I can sense the error myself and handle it cleanly. That works fine

However on iPhone OS (and presumably osx which I later care about) there's no flag to indicate not to throw SIGPIPE. I can do signal(SIGPIPE, IGN); which seems to USUALLY stop it, but still sometimes I get it??? (This could be due to where I set that signal handling up - I may only do it on app start and I instead may have to do it every time the app becomes active??)

This all makes me feel like I'm catching the disconnect the wrong way - should I be using select() or friends to sense if a disconnect has occurred?? Specifically how can I do that?

Upvotes: 3

Views: 1065

Answers (1)

mike.dld
mike.dld

Reputation: 3049

You really should've googled for that one (for example, this page). In short, try using SO_NOPIPE socket option in addition to what you've already tried.

Upvotes: 1

Related Questions