TCP/IP Programming Manual
chan = socket(AF_INET, SOCK_DGRAM, 0);
if (chan == -1){
printf ("echo server: socket failed\n");
exit (0);
}
/*
* Bind it to an Internet Address
*/
len = sizeof(sin);
status = bind(chan, (struct sockaddr *)&sin, len);
if (status == -1)
perror ("echo server: bind failed");
optlen = sizeof(optval);
optval = 1;
if (setsockopt(chan,SOL_SOCKET,SO_BROADCAST,
(char *)&optval,optlen) < 0)
perror("setsockopt");
optlen = sizeof(optval);
optval = 20*1024;
if (setsockopt(chan,SOL_SOCKET,SO_RCVBUF,
(char *)&optval,optlen) < 0)
perror("setsockopt(RCVBUF)");
optlen = sizeof(optval);
optval = 20*1024;
if (setsockopt(chan,SOL_SOCKET,SO_SNDBUF,
(char *)&optval,optlen) < 0)
perror("setsockopt(SNDBUF)");
while (1)
{
int tosend, sent = 0;
len = sizeof(remote);
tosend = sizeof( buf);
status = recvfrom(chan, (char *)&buf[0], tosend, 0,
(struct sockaddr *)&remote, &len);
if (status == -1)
perror ("echo server: recvfrom failed");
else
buf[status] = 0;
if (buf[0] == 0) continue;
tosend = (int)strlen(buf);
retry:
len = sizeof(remote);
status = sendto(chan, ((char *)buf + sent), tosend, 0,
(struct sockaddr *)&remote, len);
switch (status) {
case 0:
DELAY(5L);
goto retry;
case -1:
perror ("echo server: send failed");
break;
default:
if ( (sent = sent + status) < tosend) {
tosend = tosend - sent;
goto retry;
}
break;
}
}
}
224 Sample Programs