./ MultiCS.r82 / th-srv.c
/////////////////////////////////////////////////////////////////////////////// // THREAD CONNECT TO SERVERS /////////////////////////////////////////////////////////////////////////////// void *cs_connect_srv_th(struct server_data *srv) { int fd; // --->> FAST THREAD srv->connection.status = -1; // we are connecting srv->connection.time = GetTickCount(); struct host_data *host = srv->host; uint32_t ip = host->ip; if (!ip) ip = host->clip; fd = CreateClientSockTcp(ip, srv->port); if (fd<0) { // Setup Host Checking ip time if ( host->checkiptime > (getseconds()+60) ) host->checkiptime = getseconds()+60; // srv->error = errno; debugf(getdbgflag(DBG_SERVER,0,srv->id)," server: socket connection failed to server (%s:%d)\n", srv->host->name,srv->port); if (errno==ECONNREFUSED) { static char msg[]= "No-one listening on the remote address"; srv->statmsg = msg; } else if (errno==ENETUNREACH) { static char msg[]= "Network is unreachable"; srv->statmsg = msg; } else if (errno==ETIMEDOUT) { static char msg[]= "Timeout while attempting connection"; srv->statmsg = msg; } else { static char msg[]= "socket connection failed"; srv->statmsg = msg; } if (srv->connection.delay<90000) srv->connection.delay = srv->connection.delay + 10000; srv->connection.status = 0; return NULL; } //SetSocketKeepalive(fd); SetSocketNoDelay(fd); SetSoketNonBlocking(fd); if (srv->connection.delay<90000) srv->connection.delay = srv->connection.delay + 15000; srv->error = 0; // No error if (srv->type==TYPE_NEWCAMD) { //debugf(0," Connecting to Newcamd server (%s:%d) ...\n", srv->host->name,srv->port); if ( cs_connect_srv(srv,fd)!=0 ) { debugf(getdbgflag(DBG_SERVER,0,srv->id)," server: connection failed to newcamd server (%s:%d)\n", srv->host->name,srv->port); srv->connection.status = 0; close(fd); } } #ifdef CCCAM_CLI else if (srv->type==TYPE_CCCAM) { //debugf(0," Connecting to CCcam server (%s:%d) ...\n", srv->host->name,srv->port); if ( cc_connect_srv(srv,fd)!=0 ) { debugf(getdbgflag(DBG_SERVER,0,srv->id)," server: connection failed to CCcam server (%s:%d)\n", srv->host->name,srv->port); srv->connection.status = 0; close(fd); } } #endif #ifdef RADEGAST_CLI else if (srv->type==TYPE_RADEGAST) { //debugf(0," Connecting to Radegast server (%s:%d) ...\n", srv->host->name,srv->port); if ( rdgd_connect_srv(srv,fd)!=0 ) { debugf(getdbgflag(DBG_SERVER,0,srv->id)," server: connection failed to Radegast server (%s:%d)\n", srv->host->name,srv->port); srv->connection.status = 0; close(fd); } } #endif #ifdef CS378X_CLI else if (srv->type==TYPE_CS378X) { //debugf(0," Connecting to CS378X server (%s:%d) ...\n", srv->host->name,srv->port); if ( cs378x_connect_srv(srv,fd)!=0 ) { debugf(getdbgflag(DBG_SERVER,0,srv->id)," server: connection failed to cs378x server (%s:%d)\n", srv->host->name,srv->port); srv->connection.status = 0; close(fd); } } #endif else close(fd); return NULL; } #ifdef CAMD35_CLI void *camd35_connect_srv_th(struct server_data *srv) { if (srv->type!=TYPE_CAMD35) return NULL; //debugf(0," Connecting to camd35 server (%s:%d) ...\n", srv->host->name,srv->port); srv->connection.status = -1; srv->connection.time = GetTickCount(); struct host_data *host = srv->host; uint32_t ip = host->ip; if (!ip) ip = host->clip; int fd = CreateClientSockUdp( 0, 0 ); //srv->port, ip); if (fd<0) { static char msg[]= "socket creation failed"; srv->statmsg = msg; srv->connection.delay += 10000; srv->connection.status = 0; return NULL; } if (srv->connection.delay<90000) srv->connection.delay += 15000; srv->error = 0; // No error if ( camd35_connect_srv(srv,fd)!=0 ) { debugf(getdbgflag(DBG_SERVER,0,srv->id)," server: connection failed to camd35 server (%s:%d)\n", srv->host->name,srv->port); srv->connection.status = 0; close( fd ); } return NULL; } #endif void connect_server(struct server_data *srv) { uint32_t ticks = GetTickCount(); pthread_t srv_tid; while (srv) { if ( !IS_DISABLED(srv->flags) ) { if ( ( (srv->host->ip)||(srv->host->clip) ) && !isblockedip(srv->host->ip) ) { if ( !srv->connection.status ) { if ( (srv->connection.time+srv->connection.delay) < ticks ) { #ifdef CAMD35_CLI if (srv->type==TYPE_CAMD35) create_thread(&srv_tid, (threadfn)camd35_connect_srv_th, srv); else #endif create_thread(&srv_tid, (threadfn)cs_connect_srv_th, srv); // Lock server } } } else { static char msg[]= "Invalid Address"; srv->statmsg = msg; } } else { static char msg[]= "Disabled"; srv->statmsg = msg; } srv = srv->next; } } void *connect_servers(void *param) { prg.pid_srv = syscall(SYS_gettid); prctl(PR_SET_NAME,"Server Conn",0,0,0); while (!prg.restart) { pthread_mutex_lock(&prg.locksrvth); connect_server(cfg.server); sleep(1); connect_server(cfg.cacheexserver); pthread_mutex_unlock(&prg.locksrvth); sleep(3); } return NULL; } int start_thread_srv() { create_thread(&prg.tid_srv, (threadfn)connect_servers,NULL); return 0; }