예제 #1
0
파일: client.c 프로젝트: corizzi/r-saux
void *
canalThread (void *arg)
{
    struct comm *a = arg;

    struct comm can[2];

    struct comm listeClients[MAX_CLI];

    commArrayInit (listeClients);

    switch (a->etat)
    {
	case STATE_INIT:;
	    commCpy (&can[0], &a[0]);
	    commInit (&can[1]);
	    can[0].port = rand () % ESPACE_PORT + PLAGE_CANAL;
	    serveur (can, &canalSub, listeClients);
	    break;

	case STATE_CL_SUP:;
	    // Le client 'me' ouvre un thread (can) 
	    // identification dédié à suppléer 'sup'.

	    // On copie le nom du serveur à surveiller.
	    strncpy (can[0].nom, a[1].nom, strlen (a[1].nom));
	    // On lui ajoute une petite extension pour le
	    // distinguer.
	    strncat (can[0].nom, SUFF_SUP, strlen (SUFF_SUP));

	    // On prend notre adresse et tire au sort un port.
	    strncpy (can[0].padr, a[0].padr, strlen (a[0].padr));
	    can[0].port = rand () % ESPACE_PORT + PLAGE_CANAL;

	    // On s'affecte l'etat 'watcher'.
	    can[0].etat = STATE_CH_WAT;

	    // On conserve l'identité du serveur à surveiller.
	    commCpy (&can[1], &a[1]);
	    serveur (can, &canalSub, listeClients);
	    break;

	default:;
	    printf ("/!\\ Etat invalide ! (canal)\n");
    }

    pthread_exit (NULL);
}
예제 #2
0
파일: client.c 프로젝트: corizzi/r-saux
void *
annuaireThread (void *arg)
{
    (void) arg;
    struct comm listeCannaux[MAX_CHAN];

    commArrayInit (listeCannaux);

    serveur (&annuaire, &annuaireSub, listeCannaux);
    pthread_exit (NULL);
}
예제 #3
0
int main (int argc, char *argv [])
{
    int s, sd, r ;
    struct sockaddr_in6 monadr, sonadr ;
    socklen_t salong ;
    int port, val ;
    char padr [INET6_ADDRSTRLEN] ;

    switch (argc)
    {
	case 1 :
	    port = 9000 ;
	    break ;
	case 2 :
	    port = atoi (argv [1]) ;
	    break ;
	default :
	    usage (argv [0]) ;
    }

    s = socket (PF_INET6, SOCK_STREAM, 0) ;
    if (s == -1) raler ("socket") ;

    val = 0 ;
    r = setsockopt (s, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof val) ;
    if (r == -1) raler ("setsockopt") ;

    memset (&monadr, 0, sizeof monadr) ;
    monadr.sin6_family = AF_INET6 ;
    monadr.sin6_port = htons (port) ;
    monadr.sin6_addr = in6addr_any ;
    r = bind (s, (struct sockaddr *) &monadr, sizeof monadr) ;
    if (r == -1) raler ("bind") ;

    r = listen (s, 5) ;
    if (r == -1) raler ("listen") ;

    salong = sizeof sonadr ;
    sd = accept (s, (struct sockaddr *) &sonadr, &salong) ;
    if (sd == -1) raler ("accept") ;

    if (inet_ntop (AF_INET6, &sonadr.sin6_addr, padr, sizeof padr) == NULL)
	raler ("inet_ntop") ;
    printf ("Connexion depuis %s\n", padr) ;

    serveur (sd) ;
    
    close (sd) ;
    close (s) ;

    exit (0) ;
}
예제 #4
0
파일: client.c 프로젝트: corizzi/r-saux
void *
clientThread (void *arg)
{
    struct comm *m = arg;

    if (m->etat == STATE_CL_SIM_INIT || m->etat == STATE_CL_SUP_INIT)
    {
	// Contact de l'annuaire et ouverture du serveur
	m->port = rand () % ESPACE_PORT + PLAGE_CLIENT;
	pthread_mutex_lock (&annuaire.mutex);
	envoiUDP (m, &annuaire, CODE_AN_ListReq);
	pthread_mutex_unlock (&annuaire.mutex);
	serveur (m, &clientSub, NULL);
    }

    // Thread d'entree au clavier
    else if (m->etat == STATE_CL_SIM || m->etat == STATE_CL_SUP)
    {
	long r;
	char entree[MAXLEN];
	char msg[MAXLEN];

	memset (entree, '\0', sizeof entree);
	memset (msg, '\0', sizeof msg);

	while ((r = read (0, entree, MAXLEN)) > 0)
	{
	    strncpy (msg, CODE_CH_msgCli, SIZE_CODE);
	    strncat (msg, entree, strlen (entree) - 1);
	    pthread_mutex_lock (&moi[1].mutex);
	    envoiUDP (&moi[0], &moi[1], msg);
	    pthread_mutex_unlock (&moi[1].mutex);
	    memset (entree, '\0', sizeof entree);
	    memset (msg, '\0', sizeof msg);
	}
    }
    pthread_exit (NULL);
}
예제 #5
0
파일: serveur.c 프로젝트: Marthin-/Reseau
int main(int argc, char const *argv[])
{
	
	return serveur();
}