2012-04-15 1 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

답변

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의 새로운 기능입니다. –

+0

@ MahmoudAl-Qudsi는 "매우 가능성 있음"을 정의합니다. 얼마 동안은 GCC에서 사용할 수 있었고 MSVC 2010이이를 구현합니다. – mfontanini

+0

다른 사람들의 C++ 03 답변에 "awfull"[sic] (귀하의 인용문)을 정당화하기에 "충분하지 않습니다". –

2

a std::vector<char>&my_vector[0]으로 안전하게 char*으로 변환됩니다. 이 벡터는 당신이 &ip[0]입니다 vector<char> ip의 경우, 첫 번째 항목의 주소를 복용하여 액세스 할 수있는 연속적인 메모리의 해당 항목을, 레이아웃 것을 guarantied되는 STL에서

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 기능입니다. –

1

. 같은 방법으로 vector<char> *pIp의 경우 &(*pIp)[0]이어야합니다.

또한 &pIp->operator[](0)를 사용하여 첫 번째 항목을 참조 할 수 있습니다,하지만 난 않을 것 .. :-)

이 제도가 반환 guarantied되지 않기 때문에 당신은하지 그러나, pIp->begin()를 사용하여 첫 번째 항목을 참조 할 수 있습니다 진짜 주소.