home *** CD-ROM | disk | FTP | other *** search
- /* socket_ConNeCT . c
- #
- % Copyright (c) Jin Guojun
- %
- % Socket Connection Server
- %
- % AUTHOR: Jin Guojun - LBL 1/1/93
- */
-
- #include "net_need.h"
-
- socket_connect( int sfd, struct sockaddr_in* sc_addr,
- int trans, int prot, int options, int *ov, int ol)
- {
- char* sc_emsg=0;
- int ssof=sizeof(*sc_addr), window, i=sizeof(window);
-
- if(options && setsockopt(sfd, SOL_SOCKET, options, ov, ol) < 0)
- sc_emsg = "setsockopt";
- else switch (prot) {
- case TCP_SOCK:
- if (trans) {
- #ifdef NO_AF_TYPE
- sc_addr->sin_family = AF_UNSPEC;
- #endif
- if(connect(sfd, sc_addr, ssof) < 0)
- sc_emsg = "connect";
- } else {
- /* should listen for the connections */
- listen(sfd, 5); /* allow a queue of 5 */
- if((sfd=accept(sfd, sc_addr, &ssof) ) < 0)
- sc_emsg = "accept";
- }
- break;
-
- case UDP_SOCK:
- case IP_SOCK:
- break;
-
- case RTP_SOCK:
- if ((ol=getsockopt(sfd, SOL_SOCKET, trans ? SO_SNDBUF : SO_RCVBUF,
- &window, &i)) >= 0) {
- PacketProto pp;
- if (trans) {
- struct sockaddr_in s_other;
- pp.window = window;
- sendto(sfd, &pp, sizeof(pp), 0, sc_addr, sizeof(*sc_addr));
- recvfrom(sfd, &pp, sizeof(pp), 0, &s_other, &ssof);
- if (pp.window < window)
- window = pp.window;
- }
- else {
- recvfrom(sfd, &pp, sizeof(pp), 0, sc_addr, &ssof);
- if (pp.window > window)
- pp.window = window;
- else window = pp.window;
- sendto(sfd, &pp, sizeof(pp), 0, sc_addr, sizeof(*sc_addr));
- }
- sfd = window;
- } else sfd = ol;
- break;
-
- default: sc_emsg = "unknown protocol";
- }
- if (sc_emsg) sfd = prgmerr(0, sc_emsg);
- return sfd;
- }
-