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

Sending and Receiving Data Asynchronously

Page 76 highlights

Advanced Topics for Stream Sockets Sending and Receiving Data Asynchronously Notification that out-of-band data has been received is also done asynchronously; see the section "Sending and Receiving Out-of-band Data" in this chapter for more details. The following example sets up an asynchronous SOCK_STREAM listen socket. This is typical of an application that needs to be notified when connection requests arrive. int ls; int flag = 1; int iohndlr(); /* SOCK_STREAM listen socket initialized */ /* for ioctl, to turn on async */ /* the function which handles the SIGIO */ signal (SIGIO, iohndlr); /* set up the handler */ if (ioctl (ls, FIOASYNC, &flag) == -1) { perror ("can't set async on socket"); exit(1); } flag = -getpid();/* process group negative = deliver to process */ if (ioctl (ls, SIOCSPGRP, &flag) == -1) { perror ("can't set pgrp"); exit(1); } /* signal can come any time now */ The following example illustrates the use of process group notification. Note that the real utility of this feature is to allow multiple processes to receive the signal, which is not illustrated here. For example, the socket could be of type SOCK_DGRAM; a signal here can be interpreted as the arrival of a service-request packet. Multiple identical servers could be set up, and the first available one could receive and process the packet. int flag = 1; int iohndlr(); signal (SIGIO, iohndlr); /* ioctl to turn on async */ setpgrp(); /* set my processes' process group */ if (ioctl (s, FIOASYNC, &flag) == -1) { perror ("can't set async on socket"); exit(1); } flag = getpid(); /* process group + = deliver to each process in group */ if (ioctl (s, SIOCSPGRP, &flag) == -1) { perror ("can't set pgrp"); exit(1); } /* signal can come any time now */ 76 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

76
Chapter 3
Advanced Topics for Stream Sockets
Sending and Receiving Data Asynchronously
Notification that out-of-band data has been received is also done
asynchronously; see the section “Sending and Receiving Out-of-band
Data” in this chapter for more details.
The following example sets up an asynchronous SOCK_STREAM listen
socket. This is typical of an application that needs to be notified when
connection requests arrive.
int ls;
/* SOCK_STREAM listen socket initialized */
int flag = 1;
/* for ioctl, to turn on async */
int iohndlr();
/* the function which handles the SIGIO */
signal (SIGIO, iohndlr); /* set up the handler */
if (ioctl (ls, FIOASYNC, &flag) == -1) {
perror (“can't set async on socket”);
exit(1);
}
flag = -getpid();/* process group negative = deliver to process */
if (ioctl (ls, SIOCSPGRP, &flag) == -1) {
perror (“can't set pgrp”);
exit(1);
}
/* signal can come any time now */
The following example illustrates the use of process group notification.
Note that the real utility of this feature is to allow multiple processes to
receive the signal, which is not illustrated here. For example, the socket
could be of type SOCK_DGRAM; a signal here can be interpreted as the
arrival of a service-request packet. Multiple identical servers could be set
up, and the first available one could receive and process the packet.
int flag = 1;
/* ioctl to turn on async */
int iohndlr();
signal (SIGIO, iohndlr);
setpgrp();
/* set my processes' process group */
if (ioctl (s, FIOASYNC, &flag) == -1) {
perror (“can't set async on socket”);
exit(1);
}
flag = getpid(); /* process group + = deliver to each process in group */
if (ioctl (s, SIOCSPGRP, &flag) == -1) {
perror (“can't set pgrp”);
exit(1);
}
/* signal can come any time now */