//note: it can take a while before the listen socket is actually on... So if you immediately start an upload //after starting this thread, you might be rejected.. void UploadManager::run() { int new_fd; fd_set fd; timeval tv; //timeout for select, so that the keepRunning flag is regularly checked and thread can be stopped tv.tv_sec = 1; tv.tv_usec = 0; struct sockaddr_storage client_addr; // client address information socklen_t sin_size; int port = listenPort; while((listenFD = openListenSocket(port)) < 0){ port++; if ((port-listenPort) > 5) return; //return; //stop the UploadManager } std::cout << "UploadManager listening on port " << port << std::endl; while (keepRunning) { // main accept() loop FD_ZERO(&fd); FD_SET(listenFD, &fd); if (select(listenFD + 1, &fd, NULL, NULL, &tv) > 0) { sin_size = sizeof client_addr; std::cout << "New connection detected" << std::endl; new_fd = accept(listenFD, (struct sockaddr *) &client_addr, &sin_size); if (new_fd == -1) { std::cerr << "accept" << strerror(errno) << std::endl; continue; } char s[INET6_ADDRSTRLEN]; inet_ntop(client_addr.ss_family, get_in_addr((struct sockaddr *) &client_addr), s, sizeof s); std::cout << "Got connection from " << s << " on FD" << new_fd << std::endl; handleNewConnection(new_fd); } //time-out of select, evaluate if thread should till be running } //thread was asked to stop, do cleanup here //todo: what with still running uploads? close(listenFD); std::cout << "UploadManager stopped" << std::endl; }
/** * main() */ int main() { int lsd = -1; //listening socketdescriptor int asd = -1; //new socketdescriptor from accept int port = TM_PORT_ECHO; //default port int error = 0; int result; //int i; struct sockaddr_in addr; struct sockaddr_in claddr; char ClientIP[17]; int taskrdy = -1; initServer(); startDK40Task(); initSubServerTask(lsd,error); RTX_Sleep_Time(100); lsd = openListenSocket(lsd,error); #ifdef TCPSERV_DEBUG printf("\r\nTCP Echoserver: Öffnen einen Socket %d",lsd); #endif /** * Setzt den horchenden Socket auf Wiederverwendbar ein * @param lsd Den Socketdeskriptor des horchenden Sockets * @param error Fehlercode * @return (0) für erfolgreich, ungleich (0) für fehler */ result = setreuse(lsd,&error); #ifdef TCPSERV_DEBUG if(result == API_ERROR){ printf("\r\nTCP Echoserver: Set reuse failed %d",error); } #endif addr.sin_family = PF_INET; addr.sin_port = htons(port); //Konvertierung von Little Endian zu Big Endian addr.sin_addr.s_addr = 0L; result = bind(lsd,(struct sockaddr *)&addr,&error); if(result == API_ERROR){ printf("\r\nTCP Echoserver, Bind socket failed %d",error); shutDownServer(lsd,error); }//(result == API_ERROR) /* * Endlosschleife, horcht und baut Verbindungen auf */ while(1) { /** * listen */ result = listen(lsd, MAX_SERVER, &error); if(result == API_ERROR){ printf("\r\nTCP Echoserver, listen failed %d",error); shutDownServer(lsd,error); }//if(result == API_ERROR) /** * accept , establish a connection */ claddr.sin_family = PF_INET; claddr.sin_port = 0; //clear claddr.sin_addr.s_addr = 0L; //clear result = accept(lsd,(struct sockaddr *)&claddr,&error); if(result == API_ERROR){ printf("\r\nTCP Echoserver, accept failed %d",error); shutDownServer(lsd,error); }//if(result == API_ERROR) InetToAscii(&claddr.sin_addr.s_addr,ClientIP); #ifdef TCPSERV_DEBUG printf("\r\nTCP Echoserver: Connected with %s , Port %u\r\n",ClientIP,claddr.sin_port); #endif asd = result; cnt_connection++; #ifdef SERVER_SHUTDOWN_TEST if(cnt_connection>6L){ result = closesocket(asd,&error); if(result==API_ERROR){ printf("\r\nTCP Echoserver, socket close failed %d",error); } printf("\r\nTCP Echoserver: Shutdown test\r\n"); shutDownServer(lsd,error); }//if(cnt_connection>6L) #endif /** * Suche einer ruhenden Server Task */ taskrdy = Get_Free_Server_Task(); if(taskrdy == -1){ //no sleeping task found #ifdef TCPSERV_DEBUG printf("\r\nTCPserver: busy, refusing connection with %s , Port %u\r\n",ClientIP,claddr.sin_port); #endif closesocket(asd, &error); }//if(taskrdy == -1) else{ //insert the socket descriptor EchoServer[taskrdy].sd = asd; //and wakeup the sleeping server task result = RTX_Wakeup(EchoServer[taskrdy].taskID); if(result != 0){ printf("\r\nTCPserver: wakeup error\r\n"); closesocket(asd, &error); }//if(result != 0) else{ //a task is waked up and serves from now on this connection } }//elseif(taskrdy == -1) //no sleeping task found }//while(1) //do forever }
int main(int argc, char *argv[], char *envp[]) { int in[2], out[2], err[2]; int status; int ssh_stdinfd, ssh_stdoutfd, ssh_stderrfd; if (argc < 2) { printf("***ERROR: This program shouldn't be used directly.\n"); exit(1); } if (strcmp(argv[1], "--noStrictHostKeyChecking") == 0) { noStrictHostKeyChecking = 1; argv++; } createStdioFds(in, out, err); listenSock = openListenSocket(); signal(SIGCHLD, signal_handler); pid_t sshChildPid = fork(); if (sshChildPid == 0) { char buf[PATH_MAX + 80]; char hostname[80]; int port = getport(listenSock); close(listenSock); close(in[1]); close(out[0]); close(err[0]); dup2(in[0], STDIN_FILENO); dup2(out[1], STDOUT_FILENO); dup2(err[1], STDERR_FILENO); unsetenv("LD_PRELOAD"); // Replace dmtcp_sshd replace with "dmtcp_sshd --host <host> --port <port>" struct in_addr saddr; if (dmtcp_get_local_ip_addr == NULL) { printf("ERROR: Unable to find dmtcp_get_local_ip_addr.\n"); abort(); } dmtcp_get_local_ip_addr(&saddr); char *hostip = inet_ntoa(saddr); strcpy(hostname, hostip); size_t i = 0; while (argv[i] != NULL) { // "dmtcp_sshd" may be embedded deep inside the command line. char *ptr = strstr(argv[i], SSHD_BINARY); if (ptr != NULL) { ptr += strlen(SSHD_BINARY); if (*ptr != '\0') { *ptr = '\0'; ptr++; } snprintf(buf, sizeof buf, "%s --host %s --port %d %s", argv[i], hostip, port, ptr); argv[i] = buf; } i++; } execvp(argv[1], &argv[1]); printf("%s:%d DMTCP Error detected. Failed to exec.", __FILE__, __LINE__); abort(); } int childSock = waitForConnection(listenSock); close(in[0]); close(out[1]); close(err[1]); ssh_stdinfd = in[1]; ssh_stdoutfd = out[0]; ssh_stderrfd = err[0]; assert(dmtcp_ssh_register_fds != NULL); dmtcp_ssh_register_fds(false, ssh_stdinfd, ssh_stdoutfd, ssh_stderrfd, childSock, noStrictHostKeyChecking); client_loop(ssh_stdinfd, ssh_stdoutfd, ssh_stderrfd, childSock); wait(&status); return status; }