/* * Initialize and return open socket. */ static int init(void) { int sockfd; uint32_t lport; uint32_t rport; char lhost[NI_MAXHOST]; char rhost[NI_MAXHOST]; if (is_client()) client_get_hosts(lhost, rhost); else server_get_hosts(lhost, rhost); sockfd = rds_socket(lhost, Req.port); lport = get_socket_port(sockfd); encode_uint32(&lport, lport); send_mesg(&lport, sizeof(lport), "RDS port"); recv_mesg(&rport, sizeof(rport), "RDS port"); rport = decode_uint32(&rport); rds_makeaddr(&RAddr, &RLen, rhost, rport); return sockfd; }
/* * Have an exchange with the client over TCP/IP and get the IP of our local * host. */ static void server_get_hosts(char *lhost, char *rhost) { int fd, lfd; uint32_t port; struct sockaddr_in laddr, raddr; socklen_t rlen; lfd = socket(AF_INET, SOCK_STREAM, 0); if (lfd < 0) error(SYS, "socket failed"); setsockopt_one(lfd, SO_REUSEADDR); memset(&laddr, 0, sizeof(laddr)); laddr.sin_family = AF_INET; laddr.sin_addr.s_addr = INADDR_ANY; laddr.sin_port = htons(0); if (bind(lfd, (SA *)&laddr, sizeof(laddr)) < 0) error(SYS, "bind INET failed"); port = get_socket_port(lfd); encode_uint32(&port, port); send_mesg(&port, sizeof(port), "TCP IPv4 server port"); if (listen(lfd, 1) < 0) error(SYS, "listen failed"); rlen = sizeof(raddr); fd = accept(lfd, (SA *)&raddr, &rlen); if (fd < 0) error(SYS, "accept failed"); close(lfd); get_socket_ip((SA *)&raddr, rlen, rhost, NI_MAXHOST); send_mesg(rhost, NI_MAXHOST, "client IP"); recv_mesg(lhost, NI_MAXHOST, "server IP"); close(fd); }
/* Not currently used. JRA. */ int client_socket_port(int fd) { return get_socket_port(fd); }
int client_socket_port(void) { return get_socket_port(client_fd); }
int mcast::mcast_grp::upstream(void) const { int sock=socket(PF_INET,SOCK_DGRAM,0); if(sock!=-1) { setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&mcast_ttl,sizeof(mcast_ttl)); setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,&mcast_loop,sizeof(mcast_loop)); setsockopt(sock,IPPROTO_IP,IP_MULTICAST_IF,&mcast_if_sin.sin_addr,sizeof(in_addr)); sockaddr_in sin; sin.sin_family=AF_INET; sin.sin_addr.s_addr=mcast_if_sin.sin_addr.s_addr; sin.sin_port=0; #ifdef __FreeBSD__ sin.sin_len=sizeof(sin); #endif /* __FreeBSD__ */ bind(sock,(sockaddr*)&sin,sizeof(sin)); if(verb_fp) { fprintf(verb_fp,"multicast upstream address: '%s:%i'\n",inet_ntoa(sin.sin_addr),get_socket_port(sock)); fprintf(verb_fp,"multicast upstream ttl: %i\n",mcast_ttl); } return sock; } if(verb_fp) fprintf(verb_fp,"can`t create multicast upstream channel\n"); return -1; }