In socket programming in Linux I need to write data in socket but I don\'t know socket is open or close . how to I know that socket is open and close without read ?
The way to check if you can write to a socket is, surprisingly, to try and write to it :-)
If the socket has been closed, you will get a -1
return code from write
and you can examine errno
to see what the problem was.
If the socket is still valid but you just can't write any data at the moment, write
will return 0. The read
call also behaves in a similar fashion, returning -1
if there's a problem.
Basically, for write
:
-1
, there's been a problem and you should check errno
to see if it's recoverable or fatal.0
, then you can't write anything at the moment (may be a network backlog or some other problem but definitely not (yet) fatal).Update: As caf has pointed out in the comments, I forgot to take into account the signal handling. You have to ignore the broken pipe signal or write
will fail internally by raising that signal.
You can do this by inserting:
struct sigaction new_actn, old_actn;
new_actn.sa_handler = SIG_IGN;
sigemptyset (&new_actn.sa_mask);
new_actn.sa_flags = 0;
sigaction (SIGPIPE, &new_actn, &old_actn);
before starting to use the socket functions. You can then use:
sigaction (SIGPIPE, &old_actn, NULL);
to restore the previous signal handling.