HP Rp7410 BSD Sockets Interface Programmer's Guide - Page 77

Nonblocking I/O

Page 77 highlights

NOTE Advanced Topics for Stream Sockets Nonblocking I/O Nonblocking I/O Sockets are created in blocking mode I/O by default. You can specify that a socket be put in nonblocking mode by using the ioctl system call with the FIOSNBIO request. Here is an example: #include ... ioctl(s, FIOSNBIO, &arg); arg is a pointer to int: • When int equals 0, the socket is changed to blocking mode. • When int equals 1, the socket is changed to nonblocking mode. If a socket is in nonblocking mode, the following calls are affected: accept If no connection requests are present, accept returns immediately with the EWOULDBLOCK error. connect If the connection cannot be completed immediately, connect returns with the EINPROGRESS error. recv If no data are available to be received, recv returns the value -1 and the EWOULDBLOCK error. This is also true for read. send If there is no available buffer space for the data to be transmitted, send returns the value -1 and the EWOULDBLOCK error. This is also true for write. The O_NDELAY flag for fcntl(2) is also supported. If you use this flag and there are no data available to be received on a recv, recvfrom , recvmsg, or read call, the call returns immediately with the value of 0. If you use the O_NONBLOCK flag, the call returns immediately with the value of -1 and the EAGAIN error. This is the same as returning an end-of-file condition. This is also true for send, sendto, sendmsg, and write if there is not enough buffer space to complete the send. The O_NDELAY and O_NONBLOCK flags have precedence over the FIOSNBIO flag. Setting both the O_NDELAY and O_NONBLOCK flags is not allowed. Chapter 3 77

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196

Chapter 3
77
Advanced Topics for Stream Sockets
Nonblocking I/O
Nonblocking I/O
Sockets are created in blocking mode I/O by default. You can specify that
a socket be put in nonblocking mode by using the
ioctl
system call
with the FIOSNBIO
request. Here is an example:
#include <sys/ioctl.h>
...
ioctl(s, FIOSNBIO, &arg);
arg
is a pointer to
int
:
When
int
equals 0, the socket is changed to blocking mode.
When
int
equals 1, the socket is changed to nonblocking mode.
If a socket is in nonblocking mode, the following calls are affected:
accept
If no connection requests are present,
accept
returns
immediately with the EWOULDBLOCK error.
connect
If the connection cannot be completed immediately,
connect
returns with the EINPROGRESS error.
recv
If no data are available to be received,
recv
returns
the value –1 and the EWOULDBLOCK error. This is
also true for
read
.
send
If there is no available buffer space for the data to be
transmitted,
send
returns the value -1 and the
EWOULDBLOCK error. This is also true for
write
.
The O_NDELAY flag for
fcntl(2)
is also supported. If you use this flag
and there are no data available to be received on a
recv
,
recvfrom
,
recvmsg
, or
read
call, the call returns immediately with the value of 0.
If you use the O_NONBLOCK flag, the call returns immediately with the
value of -1 and the EAGAIN error. This is the same as returning an
end-of-file condition. This is also true for
send
,
sendto
,
sendmsg
,
and
write
if there is not enough buffer space to complete the send.
NOTE
The O_NDELAY and O_NONBLOCK flags have precedence over the
FIOSNBIO flag. Setting both the O_NDELAY and O_NONBLOCK flags
is not allowed.