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










