gethostbyname和gethostbyaddress - 结构在内存中的位置

时间:2015-11-29 19:27:24

标签: c networking network-programming

两个函数都返回struct hostent *。 我想知道的是结构创建/存储在内存中的确切位置?

我的猜测是它必须在堆上,但是手册页并没有警告我们释放返回的指针。

它不能在堆栈上,否则当函数返回时该地址不再有效...

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:2)

首先,这两个功能都被认为已过时,应由getaddrinfo& getnameinfo

对于内存,应将其视为不应释放的临时静态数据。规范本身并没有声明应该如何实现。

Windows中:

  

gethostbyname函数返回的hostent结构的内存由Winsock DLL从线程本地存储内部分配。

在Linux中(来自此manual):

  

函数gethostbyname()和gethostbyaddr()可能会返回指向静态数据的指针,这些指针可能会被以后的调用覆盖。复制struct hostent是不够的,因为它包含指针;需要深层复印。

答案 1 :(得分:1)

在Windows中,它存储在线程退出时自动回收的每线程数据中。这使得多个线程可以调用API而不会相互踩踏。当然,任何单个线程都不能期望跨越调用来维护hostent

我不知道它在类Unix环境中是如何工作的。