TCP/IP Programming Manual

*/
buffer[0] = '?';
while (buffer[0] != '!') {
int sent = 0;
printf("\nInput (end with !)? ");
if (gets(buffer) == NULL) break;
if (buffer[0] == 0) continue;
tosend = (int)strlen(buffer);
retry:
printf("\nExecute SEND[TO]\n");
#ifdef CONNECTIONLESS
len = sizeof(remote);
status = sendto(channel, ((char *)buffer + sent), tosend, 0,
(struct sockaddr *)&remote, len);
#else
status = send(channel, ((char *)buffer + sent), tosend, 0);
#endif
printf("\nAfter SEND[TO], execute GETSOCKNAME\n");
optlen = sizeof(me);
if (getsockname(channel,(struct sockaddr *)&me,&optlen) < 0)
perror("getsockname");
else
printf("After send, my socket: family=%d port=%d addr=%lx\n",
me.sin_family,me.sin_port,me.sin_addr.s_addr);
switch (status) {
case 0:
DELAY(5L);
goto retry;
case -1:
perror ("echo client: send failed");
break;
default:
if ( (sent = sent + status) < tosend) {
tosend = tosend - sent;
goto retry;
}
break;
}
/*
* Read from the network
*/
printf("\nExecute SOCKET_IOCTL to determine chars on read queue");
if (socket_ioctl (channel, FIONREAD, (char *)&ncc) < 0) {
perror ("socket_ioctl(FIONREAD)");
ncc = 1;
}
else
printf(" Socket_ioctl(FIONREAD) returns %d chars\n", ncc);
while (ncc) {
len = sizeof(him);
tosend = sizeof(buffer);
printf("\nExecute RECV[FROM]\n");
#ifdef CONNECTIONLESS
status = recvfrom(channel, (char *)&buffer[0], tosend,
0, (struct sockaddr *)&him, &len);
#else
status = recv(channel, (char *)&buffer[0], tosend, 0);
#endif
if(status == -1)
perror ("echo client: receive failed");
else {
buffer[status] = 0;
#ifdef CONNECTIONLESS
printf("After RECVFROM, his socket: family=%d port=%d addr=%lx\n",
him.sin_family,him.sin_port,him.sin_addr.s_addr);
222 Sample Programs