私は与えられたIPアドレスへの複数のTCP接続を作成するプログラムを書いています。今のところ、すべてのプログラムが接続する必要があります。これはC言語でマルチスレッド化されたものですが、私は理解できない動作に遭遇しました。 connection_handler
関数の任意の行にブレークポイントを設定すると、num_clients
に関係なく、一度呼び出されたように見えます。また、connection_handler
のコードがすべて実行されるわけではないようです。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;
}
これは[mcve]ではありません。 – Stargateur
あなたのプログラムは、いくつかのスレッドが実行される前に(メインから戻ることによって)終了します。おそらく、プロセス全体を終了する前にスレッドが終了するのを待つことをお勧めします。 – Art
@Stargateur何が問題なの?私はそれが可能な限り短くないことを知っていますが、私はそれを読めるようにしようとしました。 – PoVa