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

Sending and Receiving Out-of-band Data

Page 82 highlights

Advanced Topics for Stream Sockets Sending and Receiving Out-of-band Data vec.sv_onstack = 0; if (sigvector(SIGURG, &vec, (struct sigvec *) 0) < 0) { perror("sigvector(SIGURG)"); } onurg() is a routine that handles out-of-band data in the client program. In addition, the socket's process group must be set, as shown below. The kernel will not send the signal to the process (or process group) unless this is done, even though the signal handler has been enabled. Refer to the socket(7) man page for more details. /* ** arrange for the current process to receive SIGURG ** when the socket s has urgent data: */ pid = getpid(); if (ioctl(s, SIOCSPGRP, (char *) &pid) < 0) { perror("ioctl(SIOCSPGRP)"); } /* ** If a process needs to be notified, it should be ** pid = -getpgrp(); */ If the server process is sending data to the client process, and a problem occurs, the server can send an out-of-band data byte by executing a send with the MSG_OOB flag set. This sends the out-of-band data and a SIGURG signal to the receiving process. send(sd, &msg, 1, MSG_OOB) When a SIGURG signal is received, onurg is called. onurg receives the out-of-band data byte with the MSG_OOB flag set on a recv call. It is possible that the out-of-band byte has not arrived when the SIGURG signal arrives. recv never blocks on a receive of out-of-band data, so the client may need to repeat the recv call until the out-of-band byte arrives. recv will return EINVAL if the out-of-band data is not available. Generally, the out-of-band data byte is stored independently from the normal data stream. If, however, the OOB_INLINE socket option has been turned on for this socket, the out-of-band data will remain inline and must be used without the MSG_OOB flag set on a recv() call. You cannot read past the out-of-band pointer location in one recv call. If you request more data than the amount queued on the socket before the out-of-band pointer, then recv will return only the data up to the 82 Chapter 3

  • 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

82
Chapter 3
Advanced Topics for Stream Sockets
Sending and Receiving Out-of-band Data
vec.sv_onstack = 0;
if (sigvector(SIGURG, &vec, (struct sigvec *) 0) < 0) {
perror(“sigvector(SIGURG)”);
}
onurg()
is a routine that handles out-of-band data in the client
program.
In addition, the socket's process group must be set, as shown below. The
kernel will not send the signal to the process (or process group) unless
this is done, even though the signal handler has been enabled. Refer to
the
socket(7)
man page for more details.
/*
** arrange for the current process to receive SIGURG
** when the socket s has urgent data:
*/
pid = getpid();
if (ioctl(s, SIOCSPGRP, (char *) &pid) < 0) {
perror(“ioctl(SIOCSPGRP)”);
}
/*
** If a process needs to be notified, it should be
** pid = -getpgrp();
*/
If the server process is sending data to the client process, and a problem
occurs, the server can send an out-of-band data byte by executing a
send
with the MSG_OOB flag set. This sends the out-of-band data and a
SIGURG signal to the receiving process.
send(sd, &msg, 1, MSG_OOB)
When a SIGURG signal is received,
onurg
is called.
onurg
receives the
out-of-band data byte with the MSG_OOB flag set on a
recv
call.
It is possible that the out-of-band byte has not arrived when the
SIGURG signal arrives.
recv
never blocks
on a receive of out-of-band
data, so the client may need to repeat the
recv
call until the out-of-band
byte arrives.
recv
will return EINVAL if the out-of-band data is not
available.
Generally, the out-of-band data byte is stored independently from the
normal data stream. If, however, the OOB_INLINE socket option has
been turned on for this socket, the out-of-band data will remain inline
and must be used without the MSG_OOB flag set on a
recv()
call.
You cannot read
past
the out-of-band pointer location in one
recv
call. If
you request more data than the amount queued on the socket before the
out-of-band pointer, then
recv
will return only the data up to the