2

在多线程 tcp 服务器中,我不知道如何存储每个连接的客户端地址。

首先,我们考虑在每个线程中同时只有1个tcp连接(即只有一个connfd)的情况。这个客户端地址将在每个线程中使用。

对于多线程 tcp 服务器,有以下三种类型:

(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)Half-syn和half-async:这和(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

2

只需getpeername(2)在处理线程中调用套接字,无需完全使用线程本地存储。

于 2013-05-13T22:55:37.300 回答