在多线程 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连接的情况,更是难以想象!
那么如何获取每个线程的客户端地址?有没有解决这个问题的方法?谢谢!