【问题标题】:Pass vector<char>* to function getnameinfo将 vector<char>* 传递给函数 getnameinfo
【发布时间】:2012-04-15 15:30:00
【问题描述】:

如何将vector*类型的变量传递给winsock2的getnameinfo函数?

GetSocketIPAndPort( struct sockaddr* ss, vector<char>* pIP, uint16_t* nPort )
{
    if (status = getnameinfo((sockaddr*)sin,sizeof(sin),pIP,sizeof(*ptr),0,0,NI_NUMERICHOST))       
    {
        return status;      
    }
}

最好是问一下如何将vector*转换为PCHAR?

【问题讨论】:

  • 这是 C++ 对吧?然后我标记它c++

标签: c++ vector char pchar


【解决方案1】:

使用vector::data成员函数,它返回一个指向底层数组的指针:

GetSocketIPAndPort( struct sockaddr* ss, vector<char>* pIP, uint16_t* nPort )
{
    if (status = getnameinfo((sockaddr*)sin,sizeof(sin),pIP->data(),sizeof(*ptr),0,0,NI_NUMERICHOST))       
        return status;      
}

【讨论】:

  • vector::data 很可能不可用,它是 C++11 中的一个新函数
  • @MahmoudAl-Qudsi 定义“很可能不可用”。它在 GCC 中已经有一段时间了,MSVC 2010 实现了它。
  • 它“不够可用”来证明您称其他人的 C++03 答案为“糟糕”[原文如此](引用您的话)是合理的。
  • @MahmoudAl-Qudsi 好的,删除了评论。无论如何,如果语言已经实现了他的问题的确切解决方案,你为什么还要使用 C++03 hacks 来做 OP 想做的事情?
【解决方案2】:

std::vector&lt;char&gt; 可以通过编写 &amp;my_vector[0] 安全地转换为 char* - 例如

std::string fred("hello");
std::vector<char> meow(fred.begin(), fred.end());
meow.push_back('\0');
char* buffer = &meow[0];
std::cout << buffer << std::endl;

【讨论】:

  • fontanini,vector::data 是 C++11 的特性。
【解决方案3】:

在 STL 中,它保证向量在连续的内存中布局其项目,您可以通过获取第一项的地址来访问它,在vector&lt;char&gt; ip 的情况下它是&amp;ip[0]。同样,vector&lt;char&gt; *pIp 应该是&amp;(*pIp)[0]

您也可以使用&amp;pIp-&gt;operator[](0) 引用第一项,但我不会.. :-)

但是,您不能使用 pIp-&gt;begin() 引用第一项,因为该方案不保证返回真实地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2019-12-11
    • 2012-07-26
    • 2023-03-06
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多