2

マルチスレッドの tcp サーバーで、接続ごとにクライアント アドレスを保存する方法がわかりません。

まず、各スレッドで同時に 1 つの tcp 接続 (つまり、1 つの connfd) しか存在しない場合を考えてみましょう。このクライアント アドレスは各スレッドで使用されます。

マルチスレッド TCP サーバーの場合、次の 3 つのタイプがあります。

(1) 接続ごとに 1 つのスレッド。このタイプでは、スレッド固有のデータを使用してクライアント アドレスを格納できます。お気に入り:

listen(listenfd, backlog);
pthread_key_create(&key, null);
for(;;){
    connfd=accept(listenfd, client_addr, socklen);
    pthread_create(pid, null, func, null);
    ..
 }

func(){
  pthread_setspecific(key,(void *)client_addr);
  // **and then the client_addr can be obtained by pthread_getspecific(key)**
}

このソリューションに問題はありますか?残念ながら、前 pthread_setspecific()に呼び出され、accept()再度呼び出され、client_addr が変更されます。

(2) 半同期および半非同期: これは (1) と同様です。

(3)リーダーフォロワー型:

 connfd=listen(listenfd, backlog);
 pthread_key_create(&key, null);
 for(i:N){
     pthread_create(pid, null, func, null);
 }

 func(){
      accept(listenfd, client_addr, socklen);
      pthread_setspecific(key,(void *)client_addr);
 }

client_addr は accept() と pthread_setspecific() の間で変更される可能性があるため、このタイプの場合も同様です。

各スレッドが同時に多くの tcp 接続を持つ場合、それは想像を絶することです!

各スレッドのクライアントアドレスを取得するにはどうすればよいですか? この問題の回避策はありますか? ありがとう!

4

1 に答える 1