home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 01 / bookrev.asc < prev    next >
Text File  |  1990-12-07  |  2KB  |  103 lines

  1. _PROGRAMMER'S BOOKSHELF COLUMN_
  2. by Andrew Schulman
  3.  
  4. [FIGURE 1: (a) non-networking ``hello world'' (b) networking
  5. ``hello world'']
  6.  
  7.  
  8. (a)
  9.  
  10. /* HELLO.C */
  11. main()
  12. {
  13.     puts("hello world");
  14. }
  15.  
  16.  
  17. (b) 
  18.  
  19. typedef struct {
  20.     int request;
  21.     int len;
  22.     char buf[MAX];
  23.     } REQUEST_PACKET;           /* client requests to server */
  24. typedef unsigned REPLY_PACKET;  /* server replies to client */
  25.  
  26. /* H_CLIENT.C */
  27. main()
  28. {
  29.     REQUEST_PACKET requ;
  30.     REPLY_PACKET reply;
  31.     char *msg = "hello world";
  32.     conn = call(machine_running_H_SERVER);
  33.     requ.request = DISPLAY;
  34.     requ.len = strlen(msg);
  35.     strcpy(requ.buf, msg);
  36.     send(conn, &requ, sizeof(REQUEST_PACKET));
  37.     receive(conn, &reply, sizeof(REPLY_PACKET));
  38.     puts(reply == OK ? "ok" : "fail");
  39.     hangup(conn);
  40. }
  41.  
  42. /* H_SERVER.C */
  43. main()
  44. {
  45.     REQUEST_PACKET requ;
  46.     REPLY_PACKET ok = OK;
  47.     for (;;) /* endless loop */
  48.     {
  49.         conn = listen(anyone);
  50.         receive(conn, &requ, sizeof(REQUEST_PACKET));
  51.         switch (requ.request)
  52.         {
  53.             case DISPLAY:
  54.                 printf("%*s\n", requ.len, requ.buf);
  55.                 send(conn, &ok, sizeof(REPLY_PACKET)); 
  56.                 break;
  57.             // handle other requests
  58.         }
  59.         hangup(conn);
  60.     }
  61. }
  62.  
  63.  
  64. [FIGURE 2: No-wait networking ``hello'' server]
  65.  
  66.  
  67. /* H_SERVER.C */
  68. hangup_handler()        /* called when hangup completes */
  69. {
  70.     // free any buffers allocated in listen_handler, etc.
  71. }
  72. send_handler()          /* called when send completes */
  73. {
  74.     // do nothing
  75. }
  76. receive_handler(requ)   /* called when receive completes */
  77. {
  78.     REPLY_PACKET ok = OK;
  79.     switch (requ.request)
  80.     {
  81.         case DISPLAY:
  82.             printf("%*s\n", requ.len, requ.buf);
  83.             send_nowait(conn, &ok, sizeof(REPLY_PACKET),
  84.                 send_handler);
  85.             break;
  86.         // handle other requests
  87.     }
  88.     hangup_nowait(conn, hangup_handler);
  89. }
  90. listen_handler(conn)    /* called when listen completes */
  91. {
  92.     REQUEST_PACKET requ;
  93.     receive_nowait(conn, &requ, sizeof(REQUEST_PACKET), 
  94.         receive_handler);
  95. }
  96. main()
  97. {
  98.     for (;;) /* endless loop */
  99.         listen_nowait(anyone, listen_handler);
  100. }
  101.  
  102.  
  103.