home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / ccs / ccs-11tl.lha / lbl / xview / lib / sock_xex.cx < prev    next >
Encoding:
Text File  |  1993-05-11  |  3.6 KB  |  162 lines

  1. /*    socket_ms . c
  2. #
  3. %    Copyright (c)    Jin Guojun
  4. %
  5. %    Socket Master Server
  6. %
  7. % AUTHOR:    Jin Guojun - LBL    1/1/93
  8. */
  9.  
  10. #include <sys/asynch.h>
  11. #include <fcntl.h>
  12. #include "net_need.h"
  13.  
  14. #ifndef    SERVER
  15. #define    SERVER    "s_master"
  16. #endif
  17.  
  18.  
  19. static    rtpmsg_hd    msg_hdr;
  20. static    char    buf[1024], **plist;
  21. static    int    pnum, as, so;
  22. static    magic_server    ss[2];    /* 0 for TCP, and 1 for UDP    */
  23. static    struct sockaddr_in    sain;
  24.  
  25. build_arg_list(buf, tpp)
  26. char *buf, **tpp[];
  27. {
  28. register int    i, n, p=n=0;
  29. char*    *lp;
  30.     Loop    {
  31.         n++;
  32.         if (!(i = strchr(buf+p, Space)))    break;
  33.         i -= (int)buf;
  34.         buf[i++] = 0;    /* add terminator    */
  35.         p = i;
  36.     }    n++;
  37.     verify_buffer_size(tpp, n--, sizeof(tpp), "tpp");
  38.     lp = *tpp;
  39.     lp[p=0] = "socket";
  40.     for (i=p; i++ < n;)    {    /* start from second ap    */
  41.         lp[i] = buf + p;
  42.         while (buf[p++]);
  43.     }
  44. return    n;
  45. }
  46.  
  47. get_arg_list(rpp)
  48. int *rpp;
  49. {
  50. if (rpp)
  51.     *rpp = (int)plist;
  52. return    pnum;
  53. }
  54.  
  55. x_extender_init(server_name, udp, buf_size)
  56. char *server_name;
  57. {
  58.     if (!server_name)
  59.         sprintf(server_name=buf, "%s", SERVER);
  60.     sain.sin_port = htons(get_port(server_name, udp));
  61.     sain.sin_family = AF_INET;
  62.     sain.sin_addr.s_addr = INADDR_ANY;
  63. retryexi:
  64.     ss[udp].so = so = socket(AF_INET, udp?SOCK_DGRAM:SOCK_STREAM, 0);
  65.     if (buf_size < 4096 || buf_size > Max_WINDOW_SIZE)
  66.         buf_size=Max_WINDOW_SIZE;
  67.     if (udp && buf_size > UDP_BUF_LIMIT)    buf_size =
  68. #ifdef  sparc
  69.         28672;
  70. #else
  71.         UDP_BUF_LIMIT;
  72. #endif
  73.  
  74.     if (!udp && bind(so, sain, sizeof(sain)))    {
  75.         close(so);
  76.         if (sain.sin_port != SV_PORT)    {
  77.             sain.sin_port = SV_PORT;
  78.             goto    retryexi;
  79.         }
  80.         return    prgmerr(0, "%d:bind[%d] -> port = %d",
  81.                 udp, so, sain.sin_port);
  82.     } else if (buf_size > 4096 && setsockopt(so, SOL_SOCKET,
  83.             SO_RCVBUF, &buf_size, sizeof(buf_size) ) < 0)
  84.         return    prgmerr(0, "sockbuf size %d", buf_size);
  85.     if (!udp)    listen(so, 2);
  86. return    sain.sin_port;
  87. }
  88.  
  89. FILE*
  90. x_extender(udp)
  91. {
  92. fd_set    ready;
  93. register int    i;
  94. int    l;
  95. short    psize;
  96. magic_server*    lms=ss+udp;
  97.  
  98. struct timeval    to;
  99.     FD_ZERO(&ready);
  100.     FD_SET(so = lms->so, &ready);
  101.     to.tv_sec = 0;    to.tv_usec = 100000;
  102.     if ((i=select(so+1, &ready, 0, 0, &to)) < 0 && debug)
  103.         msg("    select %d(%d)    ", i, so);
  104.     if (FD_ISSET(so, &ready))    {
  105.     FILE*    fp;
  106.         if (!lms->connected)    {
  107.         l = sizeof(sain);
  108.         lms->as = as = accept(so, sain, &l);
  109. #ifdef    _DEBUG_
  110.         msg("select returns %d[%d]{%X}\t", so, as, i);
  111. #endif
  112.         if (as > 0)    {
  113.             if (fcntl(as, F_SETOWN,  getpid())<0)
  114.             syserr("F_SETOWN %d", getpid());
  115.             if (fcntl(as, F_SETFL, FASYNC)<0)
  116.             syserr("F_SETEL FASYNC");
  117.             lms->connected++;
  118.             lms->stat = lms->dp = pnum = 0;
  119.             if ((fp=fdopen(as, "rb")))    {
  120.             if ((i=fgetc(fp)) == '#')
  121.                 if (!(l=fgetc(fp)))    {
  122.                 fread(&psize, 1, sizeof(short), fp);
  123.                 i = htons(psize) + 1;    /* NULL terminator */
  124.                 fread(&msg_hdr, 1, sizeof(msg_hdr), fp);
  125.                 fread(buf, 1, i, fp);
  126.                 gettimeofday(&lms->ts, 0);
  127.                 msg_hdr.tsr_s = lms->ts.tv_sec;
  128.                 msg_hdr.tsr_us = lms->ts.tv_usec;
  129.                 pnum = build_arg_list(buf, &plist);
  130. #ifdef    _DEBUG_
  131.                 msg("params size %d {# %d}\n", i, pnum);
  132. #endif
  133.                 }    else    ungetc(l, fp),    ungetc('#', fp);
  134.             else    ungetc(i, fp);
  135. #ifdef    _DEBUG_
  136.             msg("#1 = %d, #2 = %d\n", i, l);
  137. #endif
  138.             return    fp;
  139.             } else    return    (FILE*)prgmerr(0, "fdopen");
  140.         }
  141.         }    message("%d: something happened %d\n", lms->connected, as);
  142.     } else if (lms->connected)    {
  143.         FD_ZERO(&ready);
  144.         FD_SET(as, &ready);
  145.         i = select(as+1, &ready, 0, 0, &to);
  146. #ifdef    _DEBUG_
  147.          msg("%d {%X} %d\n", i, FD_ISSET(as, &ready), to.tv_usec);
  148. #endif
  149.         if (i && FD_ISSET(as, &ready))    {
  150.             close(as); /* prepare to reconnect */
  151.             lms->connected = 0;
  152. #ifdef    _DEBUG_
  153.             fprintf(stderr, "\t%d(%d): disconnect at {%X}\n",
  154.                 i, as, FD_ISSET(as, &ready));
  155. #endif
  156.         }
  157.     }
  158.     fflush(stderr);
  159. return    NULL;
  160. }
  161.  
  162.