Synopsis:
My program occasionally runs into a condition where it wants to send data over a socket, but that socket is blocked waiting for a response to a previous command that never came. Is there any way to unblock the socket and pick back up with it when this happens? If not that, how could I test whether the socket is blocked so I could close it and open a new one? (I need blocking sockets in the first place)
Details:
I’m connecting to a server over two sockets. Socket 1 is for general command communication. Socket 2 is for aborting running commands. Aborts can come at any time and frequently. Every command sent over socket 1 gets a response, such as:
socket1 send: set command data
socket1 read: set command ack
There is always some time between the send and the read, as the server doesn’t send anything back until the command is finished executing.
To interrupt commands in progress, I connect over a another socket and issue an abort command. I then use socket 1 to issue a new command.
I am finding that occasionally commands issued over socket 1 after an abort are hanging the program. It appears that socket 1 is blocked waiting for a response to a previously issued command that never returned (and that got interrupted). While usually it works sometimes it doesn’t (I didn’t write the server).
In these cases, is there any way for me to check to see if socket 1 is blocked waiting for a read, and if so, abandon that read and move on? Or even any way to check at all so I can close that socket and start again?
thx!
UPDATE 1: thanks for the answers. As for why I’m using blocking sockets, it’s because I’m controlling a CNC-type machine with this code, and I need to know when the command I’ve asked it to execute is done executing. The server returns the ACK when it’s done, so that seems like a good way to handle it. I like the idea of refactoring for non-blocking but can’t envision a way to get info on when the command is done otherwise. I’ll look at select and the other options.
Not meaning to seem disagreeable, but you say you need blocking sockets and then go on to describe some very good reasons for needing non-blocking sockets. I would recommend refactoring to use non-blocking.
Aside from that, the only method I’m aware of to know if a socket is blocked is the fact that your program called
recvor one of its variants and has not yet returned. Someone else may know an API that I don’t, but setting a “blocked” boolean before therecvcall and clearing it afterward is probably the best hack to get you that info. But you don’t want to do that. Trust me, the refactor will be worth it in the long run.