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;
}
Dies ist kein [mcve]. – Stargateur
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
@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