2017-07-03 14 views
1

私は与えられた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; 
} 
+0

これは[mcve]ではありません。 – Stargateur

+1

あなたのプログラムは、いくつかのスレッドが実行される前に(メインから戻ることによって)終了します。おそらく、プロセス全体を終了する前にスレッドが終了するのを待つことをお勧めします。 – Art

+0

@Stargateur何が問題なの?私はそれが可能な限り短くないことを知っていますが、私はそれを読めるようにしようとしました。 – PoVa

答えて

2

main()機能のラインreturn EXIT_SUCCESS;前に、次のコードを追加します。コードの線の上

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

を他のすべての作成されたスレッドがその実行を終了するまで、メインスレッドを待つのに役立ちます。

+1

OPがコードを追加する*理由*を拡張する必要があります。もしOP *がそれを持っていなければ、それは何をしますか? –

関連する問題