gpt4 book ai didi

c - 如何在多线程 TCP 服务器中为每个连接获取客户端地址

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:38 25 4
gpt4 key购买 nike

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

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

对于多线程的tcp server,分为三种:

(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连接的情况,更是难以想象!

那么如何获取每个线程的客户端地址呢?这个问题有什么解决方法吗?谢谢!

最佳答案

只需调用 getpeername(2)在处理线程中的套接字上,无需对线程本地存储感兴趣。

关于c - 如何在多线程 TCP 服务器中为每个连接获取客户端地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16532379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com