【问题标题】:gethostbyname and gethostbyaddress - location of structs in memorygethostbyname 和 gethostbyaddress - 结构在内存中的位置
【发布时间】:2015-11-29 19:27:23
【问题描述】:

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

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

不能入栈,否则函数返回时该地址不再有效...

我错过了什么吗?

【问题讨论】:

    标签: c networking network-programming


    【解决方案1】:

    首先,这两个函数都被认为已过时,应替换为 getaddrinfogetnameinfo

    至于内存,它应该被认为是不应该被释放的临时静态数据。规范本身并没有声明应该如何实现。

    Windows:

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

    在 Linux 中(来自 manual):

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多