2012-04-15 66 views
0

如何將類型向量*的變量傳遞給winsock2的getnameinfo函數?傳遞向量<char> *函數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;  
    } 
} 

在臉上最好問一下如何將矢量*轉換爲PCHAR?

+0

這是C++正確?然後我將它標記[tag:C++]。 – ApprenticeHacker 2012-04-15 15:35:35

回答

3

使用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;  
} 
+0

vector :: data很可能不可用,它是C++中的一個新函數。11 MatroudAl-Qudsi定義了「很可能不可用」的 – 2012-04-15 15:59:55

+0

。它已經可以在GCC中使用一段時間了,MSVC 2010實現了它。 – mfontanini 2012-04-15 16:08:11

+0

它「不夠用」來證明你調用其他人的C++ 03回答「awfull」[原文如此(引用你的意思))。 – 2012-04-15 16:09:59

2

a std::vector<char>通過書寫&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; 
+0

fontanini,vector :: data是一個C++ 11功能。 – 2012-04-15 15:59:29

1

在STL是guarantied一個矢量佈局其在連續的內存的項目,您可以通過採取第一項的地址,在vector<char> ip情況下,它是&ip[0]訪問。同樣的方法,對於vector<char> *pIp它應該是&(*pIp)[0]

您也可以參考使用&pIp->operator[](0)的第一個項目,但我不會.. :-)

你不能,但是,請參閱使用pIp->begin()的第一個項目,因爲這個方案不guarantied返回一個真實的地址。