2017-07-03 1 views
1

J'écris un programme qui créerait plusieurs connexions TCP à une adresse IP donnée. Pour l'instant, tout ce que le programme a à faire est de se connecter. C'est la première fois que je fais quelque chose de multithread en C et j'ai rencontré un comportement que je ne comprends pas. Si je mets un point d'arrêt à n'importe quelle ligne de la fonction connection_handler, il semble que l'on appelle seulement une fois, quelle que soit la num_clients. En outre, il semble que tout le code connection_handler ne soit pas exécuté.Comportement multithread Wierd

struct client_data { 
    int id; 
    in_addr_t ip; 
    int port; 
}; 

int main(int argc, char **argv) 
{ 
    int num_clients, 
     port; 
    in_addr_t ip; 

    num_clients = atoi(argv[1]); 
    ip = inet_addr(argv[2]); 
    port = atoi(argv[3]); 

    struct client_data clients[num_clients]; 
    pthread_t threads[num_clients]; 

    for (int i = 0; i < num_clients; i++) { 
     clients[i].id = id; 
     client[i].ip = ip; 
     client[i].port = port; 
     setup_client_struct(i, ip, port, &clients[i]); 
     pthread_create(&threads[i], NULL, connection_handler, (void *) &clients[i]); 
    } 

    return EXIT_SUCCESS; 
} 

void error(char *msg) 
{ 
    fprintf(stderr, "%s\n", msg); 
    exit(EXIT_FAILURE); 
} 

void * connection_handler(void *thread_arg) 
{ 
    int sock_fd; 
    struct client_data *data; 
    struct sockaddr_in serv_addr; 

    data = (struct client_data *) thread_arg; 
    sock_fd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sock_fd < 0) error("Error creating socket"); 

    bzero((char *) &serv_addr, sizeof (serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = data->ip; 
    serv_addr.sin_port = data->port; 

    if (connect(sock_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { 
     error("Error connecting"); 
    } 
    else { 
     printf("Thread No. %d connected\n", data->id); 
    } 

    close(sock_fd); 

    return 0; 
} 
+0

Ce n'est pas un [mcve]. – Stargateur

+1

Votre programme se termine (en revenant de main) avant que certains threads aient une chance de s'exécuter. Vous voulez probablement attendre que vos threads se terminent avant de quitter tout le processus. – Art

+0

@Stargateur quel est le problème? Je sais que ce n'est pas aussi court que cela pourrait l'être, mais j'ai essayé de le rendre lisible. – PoVa

Répondre

2

Ajouter code suivant avant la ligne return EXIT_SUCCESS; de main() fonction:

for (int i = 0; i < num_clients; i++) { 
    pthread_join(threads[i], NULL); 
} 

Au-dessus de la ligne de code permettra d'attendre jusqu'à ce que le fil conducteur de tous les autres threads créés sont finis avec leur exécution.

+1

Vous devriez développer * pourquoi * l'OP devrait ajouter le code. Que se passe-t-il si l'OP * ne l'a pas, et ce qu'il fait. –