Exemplo n.º 1
0
int main(int argc, char **argv){
	printf("\nTaylor:my ifconfig cmd complish use ioctl function\n");

	switch(argc){
		case 1:
			print_all_interface();
			break;
		case 2:
			print_interface_info(argv[1]);
			break;
		case 3:
			if(strcmp(argv[2], "up") == 0)
				set_if_up(argv[1]);
			else if(strcmp(argv[2], "down") == 0)
				set_if_down(argv[2]);
			else
				set_if_ip(argv[1], argv[2]);
			break;
		default:
			usage();
			break;
	}

	return 0;
}
Exemplo n.º 2
0
int main() {
  struct interface** ifs;
  int i;

  ifs = get_interfaces();

  i = 0;
  for(;;) {
    if(ifs[i] == NULL) {
      return 0;
    }

    print_interface_info(ifs[i]);

    i++;
  }


  return 0;
}
Exemplo n.º 3
0
int main(int argc, char **argv)
{
	if(argc == 2) print_interface_info(argv[1]);
	return 0;
}
Exemplo n.º 4
0
int
main(int argc, char *argv[]) {

  unsigned int portnumber;
  unsigned int maxslidewindowsize;
  interface_info_t ii[MAX_INTERFACE_INFO] = {0,};
  size_t interface_info_len;
  fd_set rset, mainset;
  int maxfdp1, i, n, mysockfd, is_local, pid, client_sockfd, temp_port, new_client_conn, table_count = 0;
  const int do_not_route = 1, on = 1;
  char str[INET_ADDRSTRLEN], msg[MAXLINE];
  struct sockaddr_in cliaddr, my_recv_addr, my_recv_netmask, cli_conn;
  table_t table[1000];
  socklen_t len = sizeof(cliaddr);
  char filename[4096] = {0,};

  bzero(&cliaddr, sizeof(cliaddr));
  bzero(&cli_conn, sizeof(cli_conn));
  bzero(&my_recv_addr, sizeof(my_recv_addr));


  if (readargsfromfile(&portnumber, &maxslidewindowsize) == -1) {
    err_quit("Read/parse error from server.in file");
    return -1;
  }

  printf("port num: %d\nmaxslidewinsize:%d\n\n", portnumber, maxslidewindowsize);

  build_inferface_info(ii, &interface_info_len, 1, portnumber);
  print_interface_info(ii, interface_info_len);

  build_fd_set(&mainset, ii, interface_info_len, &maxfdp1);

  for ( ; ; ) {
    rset = mainset;
    Select(maxfdp1, &rset, NULL, NULL, NULL);

    for (i = 0; i < interface_info_len; i++) {
      if (FD_ISSET(ii[i].sockfd, &rset)) {
        printf("Data recieved on %s\n", Sock_ntop((SA*) (ii[i].ip), sizeof(*(ii[i].ip))));

        mysockfd = ii[i].sockfd;
        my_recv_addr = *(ii[i].ip);
        my_recv_netmask = *(ii[i].netmask);

        n = Recvfrom(ii[i].sockfd, msg, MAXLINE, 0, (SA*) &cliaddr, &len);

        printf("Data recieved from: %s\n", Sock_ntop((SA*) &cliaddr, len));
        memcpy(filename, msg, 4096);

        if (strchr(filename, '\n'))
          *strchr(filename, '\n') = '\0';
        printf("Data(Filename):%s\n", msg);
        if (checktable(cliaddr, table_count, table) < 0 ) {
          printf("Same <ip and port> tried to conected again, not creating new child.\n");
          continue;
        }

        if ((pid = Fork()) == 0) {
          // Child
          // CLose all other sockets.
          for (i = 0; i < interface_info_len; i++)
            if (ii[i].sockfd != mysockfd)
              close(ii[i].sockfd);

          // Find out if client is loopback or local or not.
          is_local = find_if_client_local(my_recv_addr, cliaddr, ii, interface_info_len, my_recv_netmask);
          if (is_local < 3)
            printf("Client host is local\n");
          else
            printf("Client host is not local\n");

          // Create UDP socket to handle file transfer with this client."connection socket"
          client_sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
          if (is_local < 3)
            Setsockopt(client_sockfd, SOL_SOCKET, SO_DONTROUTE, &do_not_route, sizeof(do_not_route));
          Setsockopt(client_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

          cli_conn.sin_addr = my_recv_addr.sin_addr;
          cli_conn.sin_family = AF_INET;
          cli_conn.sin_port = htons(0);
          Bind(client_sockfd, (SA *) &cli_conn, sizeof(cli_conn));

          len = sizeof(cli_conn);
          Getsockname(client_sockfd, (SA*) &cli_conn, &len);

          printf("\nConnection socket bound, protocol Address:%s\n", Sock_ntop((SA*) &cli_conn, len));

          Connect(client_sockfd, (SA*) &cliaddr, sizeof(cliaddr));
          len = sizeof(cliaddr);
          Getpeername(client_sockfd, (SA*) &cliaddr, &len);
          printf("\nServer child connected to client, protocol Address:%s\n", Sock_ntop((SA*) &cliaddr, len));
          temp_port = ntohs(cli_conn.sin_port);

          send_buffer_t buf;
          sprintf(buf.payload, "%d", temp_port);
          buf.hdr.cntrl = 1;

          long long seq = -1;
          static void sig_alrm(int signo);

          Signal(SIGALRM, sig_alrm);

          Sendto(mysockfd, &buf, sizeof(buf), 0,(SA*) &cliaddr, len);
          printf("New port sent.\n");
          alarm(5);

          if (sigsetjmp(jmpbuf, 1) != 0) {
            printf ("Didn't receive ack for port number transfer. Resending.\n");
            Sendto(mysockfd, &buf, sizeof(buf), 0,(SA*) &cliaddr, len);
            Write(client_sockfd, &buf, sizeof(buf));
            alarm (5);
          }

          send_buffer_t rb;
          do {
            memset(&rb, 0, sizeof(rb));
            n = read(client_sockfd, &rb, sizeof(rb));
          } while (rb.hdr.cntrl == 0);

          printf("Msg (ACK) on new port\n");
          close(mysockfd);
          alarm(0);

          memset(&buf, 0, sizeof(buf));
          buf.hdr.sft = 1;
          Write(client_sockfd, &buf, sizeof(buf));

          if (send_file(filename, client_sockfd, maxslidewindowsize))
            printf("Failed to send file\n");

          table[table_count].is_conn = 0;
          exit(0);// exit child

        } else if (pid > 0) {
          table[table_count].ip = cliaddr;
          table[table_count].is_conn = 1;
          table_count++;

        } else {

          err_sys("Creating child failed: ");
        }
      }
    }
  }

  return 0;
}