예제 #1
0
//int CreerConnexion(struct Physique *pL, char * NCli, int pcli, char *NSer, int pser)
int CreateSockets(struct sockaddr_in *psoo, struct sockaddr_in *psos, char * NCli, int PortCli, char *NSer, int PortSer)
{
    int res;
    int desc;
    char *message;
    struct hostent *phcli, *phser;
    int ip4cl, ip4se; /*adresse du client et serveur */

    phcli = gethostbyname(NCli);
    if (phcli == NULL)
    {
        perror("Nom client\n");
        return (-1);
    }
    memcpy(&(ip4cl), phcli->h_addr_list[0], sizeof(ip4cl));
    fprintf(stderr, "IP du client:");
    afficher_adresse((struct ip4*)&(ip4cl));

    /*----- adresse IP du serveur ---*/
    if (NSer != NULL)
    {
        phser = gethostbyname(NSer);
        if (phser == NULL)
        {
            perror("Nom Serveur\n");
            return(-1);
        }
        memcpy(&(ip4se), phser->h_addr_list[0], sizeof(ip4se));
        fprintf(stderr, "IP du serveur:");
        afficher_adresse((struct ip4*)&(ip4se));
    }

    /* Creation socket Client */
    desc = creer_socket(SOCK_DGRAM, (u_long *)&(ip4cl), PortCli, psoo);
    if (desc==-1)
        return(desc);
    else
        fprintf(stderr, "Creation socket réussie \n");

    /* Creation socket Serveur */
    if (NSer != NULL)
    {
        psos-> sin_family = AF_INET;
        memcpy(&(psos->sin_addr.s_addr), &(ip4se), 4);
        psos-> sin_port = htons(PortSer);
    }
    return(desc);
}
예제 #2
0
파일: serveur.c 프로젝트: zx900930/l3info
int main(int argc,char * argv[]){

	struct sockaddr_in adresse;
	int port;
	int socket_ecoute, socket_service;

	port = atoi(argv[1]);
	socket_ecoute = creer_socket(SOCK_STREAM, &port, &adresse);
	listen(socket_ecoute, 10);
	while(1){
		printf("Attente connection\n");
		accept(socket_ecoute, (struct sockaddr*)&adresse, sizeof(struct sockaddr_in));
		printf("Nouvelle connection\n");
		if(fork() == 0){
			close(socket_ecoute);
			fonction_service(socket_service);
		}
	close(socket_service);
	return EXIT_SUCCESS;
}
예제 #3
0
파일: serveur.c 프로젝트: zx900930/l3info
int main(int argc, char* argv[]){
	SOCKADDR_IN adresse;//client
	int port;
	SOCKET socket_ecoute, socket_service;
	port = atoi(argv[1]);
	socket_ecoute = creer_socket(SOCK_STREAM, port, &adresse);
	listen(socket_ecoute,5);

	while(1){
		printf("\nAttente connection...\n");
		/*Acceptation d'une connexion pendante*/
		socket_service = accept(socket_ecoute,(SOCKADDR*)&adresse,sizeof(SOCKADDR_IN));
		printf("\nNouvelle connection\n");

		if(fork() == 0){
			close(socket_ecoute);
			client_service(socket_service);
		}

		close(socket_service);
	}
	return 0;
}
예제 #4
0
int main(int argc, char* argv[]) {

	if (argc != 5) {
		printf("error syntaxe : %s nbPort nbPort nbPort nbPort \n", argv[0]);
		exit(1);
	}
	int PORTSERV[N_SOCKET];
	int socket_attentes[N_SOCKET];
	fd_set mselect;
	int plg_desc = -1;

	int socket_cnx; /* Socket de communication */
	struct sockaddr_in sc_from; /* Nom de la socket distante */
	int sc_from_len = sizeof(sc_from);

	int i;
	for (i = 1; i <= N_SOCKET; i++)
		PORTSERV[i - 1] = atoi(argv[i]);

	FD_ZERO(&mselect);

	/* creation de la socket et ecoute sur la socket*/
	for (i = 0; i < N_SOCKET; i++) {
		socket_attentes[i] = creer_socket(PORTSERV[i]);
		listen(socket_attentes[i], 5);
		FD_SET(socket_attentes[i], &mselect);
		if (plg_desc < socket_attentes[i]) {
			plg_desc = socket_attentes[i];
		}
		printf("test plg_desc %d \n", plg_desc);
	}

	printf("%s >>>\n", argv[0]);

	FILE* file;
	if ((file = fopen("cx.log", "w")) == NULL) {
		perror("fopen");
	}

	signal(SIGINT, handler);

	while (VRAI) {

		if (select(plg_desc + 1, &mselect, NULL, NULL, NULL) <= 0) {
			perror("select");
			break;
		}
		printf("select interrompu \n");
		for (i = 0; i < N_SOCKET; ++i) {
			if (FD_ISSET(socket_attentes[i], &mselect)) {
				/* Etablir la connexion */
				if ((socket_cnx = accept(socket_attentes[i],
						(struct sockaddr *) &sc_from, &sc_from_len)) == -1) {
					perror("accept");
					exit(2);
				}
				/******** Traitement *********/
				fprintf(stdout, "IP = %s,  \n", inet_ntoa(sc_from.sin_addr));
				fprintf(file, "IP = %s  \n", inet_ntoa(sc_from.sin_addr));
				/* Fermer la connexion */
				shutdown(socket_cnx, 2);
				close(socket_cnx);
			}
		}

		/** reinitialiser l'ensemble d'ecoute sur select**/
		FD_ZERO(&mselect);
		for (i = 0; i < N_SOCKET; i++) {
			FD_SET(socket_attentes[i], &mselect);
		}
	}

	/* Fermer des sockets attentes */
	for (i = 0; i < N_SOCKET; i++) {
		close(socket_attentes[i]);
	}
	fclose(file);

	return EXIT_SUCCESS;
}
예제 #5
0
파일: dsmwrap.c 프로젝트: alahjouji/PR204
int main(int argc, char **argv)
{ 
   /* processus intermediaire pour "nettoyer" */
   /* la liste des arguments qu'on va passer */
   /* a la commande a executer vraiment */
  char nom_dsm[MAXBUF];
  int cli_sock;
  int sock_dsm;
  int port_dsm ;
  struct sockaddr_in servaddr;
  socklen_t length;
  int i=0,j;
  int rc;

   /* creation d'une socket pour se connecter au */
   /* au lanceur et envoyer/recevoir les infos */
   /* necessaires pour la phase dsm_init */   


  struct hostent *addr_srv;
  struct in_addr addr;
  addr_srv = gethostbyname(argv[1]);// recuperer dans une structure hostent l'addresse ip du lanceur a partir de son nom
  addr.s_addr = *(u_long *) addr_srv->h_addr_list[0]; //recuperer dans une structure in_addr qui correspond au nom de la machine distante
  
  struct addrinfo hints;

  memset(&hints, 0, sizeof(struct addrinfo)); // initialisation structure addrinfo
  hints.ai_socktype = SOCK_STREAM; // type : socket TCP

 
  struct addrinfo* returned_infos; 

// renvoie une ou plusieurs structures addrinfo, chacune d'entre elles contenant une adresse Internet dans returned_infos
  rc = getaddrinfo(inet_ntoa(addr), argv[2], &hints, &returned_infos);
  if (rc != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rc));
    return -1;
  }


  struct addrinfo* rp;
  //on parcourt toutes les addrinfo jusqu'a trouver l'addresse a laquelle on peut se connecter (celle actuellement en ecoute)
  for (rp = returned_infos; rp != NULL; rp = rp->ai_next) {
    //creation de la socket avec laquelle on a recevoir des donnees au lanceur
    cli_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);

    if (cli_sock == -1) {
      continue;
    }
		
    if (connect(cli_sock, rp->ai_addr, rp->ai_addrlen) == 0) {
      break; 
    }
		
    close(cli_sock); 
    cli_sock = -1;

 }

  freeaddrinfo(returned_infos);

  if(cli_sock < 0) {
    perror("Connexion echouee");
    exit(EXIT_FAILURE);
  }
   
   /* Envoi du nom de machine au lanceur */
   gethostname(nom_dsm, MAXBUF);
   printf("%s\n", nom_dsm);

   /* Envoi du pid au lanceur */
   pid_t pid = getpid();
   printf("%d\n", pid);

   /* Creation de la socket d'ecoute pour les */
   /* connexions avec les autres processus dsm */
   sock_dsm=creer_socket();



  if(listen(sock_dsm, BACKLOG) < 0) {
    perror("listen");
    exit(EXIT_FAILURE);
  }

   length=sizeof(struct sockaddr_in);
   if( getsockname(sock_dsm, (struct sockaddr*) &servaddr, &length) == -1) {
    perror("getsockname");
    exit(EXIT_FAILURE);
   }

   /* Envoi du numero de port au lanceur */
   /* pour qu'il le propage a tous les autres */
   /* processus dsm */
   port_dsm = ntohs(servaddr.sin_port);
   printf("%d\n", port_dsm);
	

  //envoi du rang au lanceur
  printf("%s\n", argv[3]);



  /// Flush ///
  fflush(stdout);
  fflush(stderr);

    //recuperer le nombre d'arguments du programme a executer
    while(argv[i+5]!=NULL){
	  i=i+1;
    }

  char* newargv[i+1] ;

  //tableau d'arguments du programme a executer
  for (j=0; j<i; j++) 
	  newargv[j] = argv[5+j];

   newargv[i]=NULL;




  //recuperation du chemin de l'executable du programme a executer
  char *chemin = "~/prog_syst/bin/"; 
  strcat(chemin, argv[4]);


   /* On execute la commande demandee */
   execvp(chemin,newargv);
   return 0;
}