2011-03-20 3 views
0

#include <winsocket2.h>없이 호스트 이름과 관련된 IP를 검색하려면 어떻게해야합니까? 어떤 컴파일 오류없이 내 DLL의 crashs는, 다음과 같은 코드가 작동하지 않기 때문에 나는 포함없이 ...#include <winsocket2.h>가없는 C++ 호스트 이름 조회

hostent *h = gethostbyname(hostName); 
     LogAlways((const char*)inet_ntoa(*(reinterpret_cast<in_addr*>(h->h_addr)))); 
+1

더 많은 코드를 제공합니다. 잘못 입력 한 것이 틀림 없지만 winsocket을 비난했습니다. – fazo

+0

'hostName'의 * 값 *은 무엇입니까? 디버거를 사용해야한다고 생각하는지 확인하십시오. 그리고 그 라인 다음에'h '에 저장된 것을 확인하십시오. 에러가 발생하면 null 포인터가 될 수 있습니다 (예 : 호스트 검색에 실패했습니다). 그러면 다음 행이 어떤 식 으로든 실패 할 수 있습니다. 실패를 정상적으로 처리해야합니다. 성공했다고 가정하지 마십시오. – Cascabel

+0

Visual Studio 2008 익스프레스 에디션을 사용하고 있습니다. 내 자체 DLL이 아닙니다. hostName의 타입은 const char *입니다. LogAlways 함수는 이것을 허용합니다. –

답변

1

<winsocket2.h> 메서드를 사용할 수 없습니다 (또는 외부 라이브러리에 대한 종속성이) 이 거의입니다 절대 안됩니다.

IP에 매핑되는 호스트 이름을 얻으려면 소켓을 사용할 수 있어야하는 RARP 요청을해야합니다. 그래서 한 가지 방법으로 소켓을 만들 수 있어야합니다. winsock2.lib이 라이브러리로 제공하는 것입니다.

그래서, winsock2.lib을 사용하는 것이 좋습니다. 컴파일 오류없이 DLL이 손상되었다고 말할 때 DLL로 컴파일하려는 코드에 대해 이야기하고 있다고 가정합니다.

디버깅은 어떻게됩니까? 코드를 실행하여 실패한 부분을 확인해 보았습니까? hostName의 유형은 무엇입니까? 널 포인터로 멤버에 액세스하려고하지 않는지 확인하십시오. 변수를 사용하기 전에 메모리를 올바르게 할당했는지 확인하십시오. 그렇지 않으면 디버거에서 어떤 오류 메시지가 표시되는지 자세히 알려주십시오.

+0

'LoadLibrary'와'LoadLibrary'를 사용하여'ws2_32.dll'에서 함수를 호출 할 수 있습니다. GetProcAddress'입니다. '#include '는 필요 없습니다. 'winsock2.lib'는 필요 없습니다. 또한이 프로그램은 이전 버전의 Windows에서 누락 된 기능을 복구 할 수있는 기회를 제공합니다. –

+0

그래, 벤 말이 맞아. 내가 말하고자했던 것은 외부 도서관에 의존하지 않고는 정말로 벗어날 수 없다는 것이다. 그것이 winsock2이든 다른 어떤 것이 든 .. –