2017-07-03 2 views
1

Ich schreibe ein Programm, das mehrere TCP-Verbindungen zu einer bestimmten IP-Adresse erstellen würde. Fürs Erste muss das ganze Programm nur verbinden. Das ist das erste Mal, dass ich etwas Multithread in C mache und ich habe ein Verhalten kennengelernt, das ich nicht verstehen kann. Wenn ich einen Haltepunkt an der beliebigen Zeile in der connection_handler Funktion einstelle, scheint es wie in nur einmal aufgerufen wird, egal was num_clients ist. Es scheint auch so, als ob nicht der gesamte Code in connection_handler ausgeführt wird.Wierd Multithread-Verhalten

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

Dies ist kein [mcve]. – Stargateur

+1

Ihr Programm wird beendet (indem es von main zurückkehrt), bevor einige Threads eine Chance bekommen, ausgeführt zu werden. Sie möchten wahrscheinlich warten, bis Ihre Threads beendet sind, bevor Sie den gesamten Prozess beenden. – Art

+0

@Stargateur was ist los damit? Ich weiß, es ist nicht so kurz, wie es sein könnte, aber ich habe versucht, es lesbar zu machen. – PoVa

Antwort

2

In folgenden Code vor Zeile return EXIT_SUCCESS; von main() Funktion:

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

Über Codezeile wird dazu beitragen, den Haupt-Thread zu warten, bis alle anderen Threads erstellt mit ihrer Ausführung fertig sind.

+1

Sie sollten erweitern * warum * das OP sollte den Code hinzufügen. Was passiert, wenn das OP * es nicht hat und was es tut? –

Verwandte Themen