I have the following code written in Objective-C that writes data to a socket. The server is running node.js on top of Ubuntu:
NSString *url = @"anIPAddress";
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)url, 9000, &readStream, &writeStream);
self.inputStream = (NSInputStream *)readStream;
self.outputStream = (NSOutputStream *)writeStream;
[self.inputStream setDelegate:self];
[self.outputStream setDelegate:self];
[self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.inputStream open];
[self.outputStream open];
I am able to connect to the server and send information. However I noticed the connection times out after a few minutes (I think 5 minutes or so?). How can I keep this connection alive? I know there is a disconnect because the same thing happens if I connect to the server under Terminal, I have to keep that connection alive. I imagine the same thing is happening in my code. Thanks for your help!
Assuming a NSOutputStream *oStream;
On iOS do it this way:
I'm posting this since I just spent hours working it all out, want to save someone else the effort.
You need to routinely send some garbage over the connection. Try this:
Then declare this in
self
:Note: Replace `"Keepalive!" with whatever you want for your protocol. The only requirement is that the remote end (socket server) ignores the message.
I found how to do this. Since the server is running node.js, I used
And in this way node keeps each socket open. The default is false, so this is why it was timing out. I hope this is useful to other people. Thank your for your responses, I think keeping a heartbeat (keep-alive) is also a good idea, but with this native approach node takes care of it.
The simplest answer is to try to use the
SO_KEEPALIVE
socket option.Broken connections can be hard to detect without data flowing between the end-points which is what makes this option in some ways useless as it doesn't use data to detect broken connections. However, it is easy to add to your code to see. Add it and see if it helps...
This is how it's done in C or C++
The not-so-simple answer is to add a
ping
packet to your protocol and send that ping packet regularly so you can detect a broken connection.