home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / tcpipsrc / h / if / MiscServ / c / SMISC < prev   
Text File  |  1994-06-24  |  3KB  |  126 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "netuser.h"
  9. #include "timer.h"
  10. #include "tcp.h"
  11. #include "misc.h"
  12. #include "arc.h"
  13.  
  14. static void disc_recv(struct tcb *, int16);
  15. static void echo_recv(struct tcb *, int16);
  16. static void echo_trans(struct tcb *, int16);
  17. static void misc_state(struct tcb *, char, char);
  18.  
  19. static struct tcb *disc_tcb,*echo_tcb;
  20.  
  21. /* Start up discard server */
  22. int dis1(int argc, char **argv)
  23. {
  24.         struct socket lsocket;
  25.  
  26.         lsocket.address = ip_addr;
  27.         if(argc < 2)
  28.                 lsocket.port = DISCARD_PORT;
  29.         else
  30.                 lsocket.port = atoi(argv[1]);
  31.         disc_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,(void(*)())disc_recv,NULLVFP,(void(*)())misc_state,0,(char *)NULL);
  32.         return(0);
  33. }
  34. /* Start echo server */
  35. int echo1(int argc, char **argv)
  36. {
  37.         struct socket lsocket;
  38.  
  39.         lsocket.address = ip_addr;
  40.         if(argc < 2)
  41.                 lsocket.port = ECHO_PORT;
  42.         else
  43.                 lsocket.port = atoi(argv[1]);
  44.         echo_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,(void(*)())echo_recv,(void(*)())echo_trans,(void(*)())misc_state,0,(char *)NULL);
  45.         return(0);
  46. }
  47.  
  48. /* Shut down miscellaneous servers */
  49. int dis0(void)
  50. {
  51.         if(disc_tcb != NULLTCB)
  52.                 close_tcp(disc_tcb);
  53.         return(0);
  54. }
  55. int echo0(void)
  56. {
  57.         if(echo_tcb != NULLTCB)
  58.                 close_tcp(echo_tcb);
  59.         return(0);
  60. }
  61. /* Discard server receiver upcall */
  62. static void disc_recv(struct tcb *tcb, int16 cnt)
  63. {
  64.         struct mbuf *bp;
  65.  
  66.         if(recv_tcp(tcb,&bp,cnt) > 0)
  67.                 free_p(bp);                     /* Discard */
  68. }
  69.  
  70. /* Echo server receive
  71.  * Copies only as much will fit on the transmit queue
  72.  */
  73. static void echo_recv(struct tcb *tcb, int16 cnt)
  74. {
  75.         struct mbuf *bp;
  76.         int acnt;
  77.  
  78.         if(cnt == 0){
  79.                 close_tcp(tcb);
  80.                 return;
  81.         }
  82.         acnt = min(cnt,tcb->snd.wnd);
  83.         if(acnt > 0){
  84.                 /* Get only as much will fit in the send window */
  85.                 recv_tcp(tcb,&bp,tcb->snd.wnd);
  86.                 send_tcp(tcb,bp);
  87.         }
  88. }
  89. /* Echo server transmit
  90.  * Copies anything that might have been left in the receiver queue
  91.  */
  92. static void echo_trans(struct tcb *tcb, int16 cnt)
  93. {
  94.         struct mbuf *bp;
  95.  
  96.         if(tcb->rcvcnt > 0){
  97.                 /* Get only as much will fit in the send window */
  98.                 recv_tcp(tcb,&bp,cnt);
  99.                 send_tcp(tcb,bp);
  100.         }
  101. }
  102.  
  103. /* Log connection state changes; also respond to remote closes */
  104. static void misc_state(register struct tcb *tcb, char old, char new)
  105. {
  106.         old = old;
  107.  
  108.         switch(new){
  109.         case ESTABLISHED:
  110.                 log_event(tcb,"open %d",tcb->conn.local.port);
  111.                 break;
  112.         case CLOSE_WAIT:
  113.                 close_tcp(tcb);
  114.                 break;
  115.         case CLOSED:
  116.                 log_event(tcb,"close %d",tcb->conn.local.port);
  117.                 del_tcp(tcb);
  118.                 /* Clean up if server is being shut down */
  119.                 if(tcb == disc_tcb)
  120.                         disc_tcb = NULLTCB;
  121.                 else if(tcb == echo_tcb)
  122.                         echo_tcb = NULLTCB;
  123.                 break;
  124.         }
  125. }
  126.