Exemplo n.º 1
0
//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;
}
Exemplo n.º 2
0
/**
 * 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
}
Exemplo n.º 3
0
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;
}