如何处理getaddrinfo和线程安全?

use*_*574 6 sockets ipv6 getaddrinfo

我正在使用getaddrinfo进行与IPv6相关的C项目.我的电脑上的"man getaddrinfo"(uname -a:3.5.0-23)仅表示它是"可重入的".所以我猜它不是线程安全的.

在需要线程安全的情况下,如何处理它?我也检查了UNP,但似乎没有提供具体的答案.非常感谢.

Rem*_*eau 12

getaddrinfo()确实是线程安全的.这是RFC 3493第6.1节要求的:

函数getaddrinfo()和freeaddrinfo()必须是线程安全的.

在某些平台上,gethostbyname()是线程安全的,但在其他平台上却不是.什么gethostbyname()是不是在所有平台上是重入的.如果您在同一个线程中调用gethostbyname()然后gethostbyname()再次调用,则第一次调用的数据将被第二次调用的数据覆盖.这是因为gethostbyname()通常在内部使用静态缓冲区,这就是为什么在gethostbyname()再次调用之前必须复制数据的原因.getaddrinfo()不会遇到这个问题,因为它addrinfo每次调用时都会分配一个新结构.