./ MultiCS.r69 / th-srv.c
/////////////////////////////////////////////////////////////////////////////// // THREAD CONNECT TO SERVERS /////////////////////////////////////////////////////////////////////////////// void *cs_connect_srv_th(struct cs_server_data *srv) { int fd; int keep = 9000; // --->> FAST THREAD srv->keepalivetime = GetTickCount(); struct host_data *host = srv->host; uint ip = host->ip; if (!ip) ip = host->clip; fd = CreateClientSockTcp_nonb(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) { keep = 60000; 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) { keep = 5000; static char msg[]= "Timeout while attempting connection"; srv->statmsg = msg; } else { static char msg[]= "socket connection failed"; srv->statmsg = msg; } srv->keepalivesent = keep; return NULL; } if (srv->keepalivesent<60000) srv->keepalivesent = srv->keepalivesent+keep; srv->error = 0; // No error if (srv->type==TYPE_NEWCAMD) { 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); close(fd); } } #ifdef CCCAM_CLI else if (srv->type==TYPE_CCCAM) { 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); close(fd); } } #endif #ifdef RADEGAST_CLI else if (srv->type==TYPE_RADEGAST) { 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); close(fd); } } #endif else close(fd); return NULL; } void *cs_connect_servers(void *param) { struct cs_server_data *srv; prg.pid_srv = syscall(SYS_gettid); prg.tid_srv = pthread_self(); while (1) { pthread_mutex_lock(&prg.locksrvth); uint ticks = GetTickCount(); srv = cfg.server; while (srv) { if (!IS_DISABLED(srv->flags)) if ( (srv->handle==INVALID_SOCKET) ) { if ( (srv->host->ip)||(srv->host->clip) ){ if ( (srv->keepalivetime+srv->keepalivesent) < ticks ) { pthread_t srv_tid; create_prio_thread(&srv_tid, (threadfn)cs_connect_srv_th, srv, 50); // Lock server //usleep(50000); } } else { static char msg[]= "Invalid Address"; srv->statmsg = msg; } } srv = srv->next; } pthread_mutex_unlock(&prg.locksrvth); sleep(5); } END_PROCESS = 1; } int start_thread_srv() { create_prio_thread(&prg.tid_srv, (threadfn)cs_connect_servers,NULL, 50); return 0; }