home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / ccs / ccs-11tl.lha / lbl / x11 / lib2 / sock_cnct.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-02  |  1.5 KB  |  68 lines

  1. /*    socket_ConNeCT . c
  2. #
  3. %    Copyright (c)    Jin Guojun
  4. %
  5. %    Socket Connection Server
  6. %
  7. % AUTHOR:    Jin Guojun - LBL    1/1/93
  8. */
  9.  
  10. #include "net_need.h"
  11.  
  12. socket_connect(    int sfd, struct sockaddr_in*    sc_addr,
  13.         int trans, int prot, int options, int *ov, int ol)
  14. {
  15. char*    sc_emsg=0;
  16. int    ssof=sizeof(*sc_addr), window, i=sizeof(window);
  17.  
  18.     if(options && setsockopt(sfd, SOL_SOCKET, options, ov, ol) < 0)
  19.     sc_emsg = "setsockopt";
  20.     else switch (prot)    {
  21.     case TCP_SOCK:
  22.     if (trans) {
  23. #ifdef    NO_AF_TYPE
  24.         sc_addr->sin_family = AF_UNSPEC;
  25. #endif
  26.         if(connect(sfd, sc_addr, ssof) < 0)
  27.             sc_emsg = "connect";
  28.     } else {
  29.         /* should listen for the connections */
  30.         listen(sfd, 5);   /* allow a queue of 5 */
  31.         if((sfd=accept(sfd, sc_addr, &ssof) ) < 0)
  32.             sc_emsg = "accept";
  33.     }
  34.     break;
  35.  
  36.     case UDP_SOCK:
  37.     case IP_SOCK:
  38.     break;
  39.  
  40.     case RTP_SOCK:
  41.     if ((ol=getsockopt(sfd, SOL_SOCKET, trans ? SO_SNDBUF : SO_RCVBUF,
  42.         &window, &i)) >= 0)    {
  43.     PacketProto    pp;
  44.         if (trans)    {
  45.         struct sockaddr_in    s_other;
  46.         pp.window = window;
  47.         sendto(sfd, &pp, sizeof(pp), 0, sc_addr, sizeof(*sc_addr));
  48.         recvfrom(sfd, &pp, sizeof(pp), 0, &s_other, &ssof);
  49.         if (pp.window < window)
  50.             window = pp.window;
  51.         }
  52.         else    {
  53.         recvfrom(sfd, &pp, sizeof(pp), 0, sc_addr, &ssof);
  54.         if (pp.window > window)
  55.             pp.window = window;
  56.         else    window = pp.window;
  57.         sendto(sfd, &pp, sizeof(pp), 0, sc_addr, sizeof(*sc_addr));
  58.         }
  59.         sfd = window;
  60.     } else sfd = ol;
  61.     break;
  62.  
  63.     default:    sc_emsg = "unknown protocol";
  64.     }
  65. if (sc_emsg)    sfd = prgmerr(0, sc_emsg);
  66. return    sfd;
  67. }
  68.