代碼:如何使用getnameinfo而不是gethostbyname?
if ((host = (struct hostent*) gethostbyname(address)) == 0) // address is a string
我已經得到警告,當交叉編譯(通用ARM架構)在4.5.x GCC:
(.text+0x1558): warning: gethostbyname is obsolescent, use getnameinfo() instead.
int WSAAPI getnameinfo(
__in const struct sockaddr FAR *sa,
__in socklen_t salen,
__out char FAR *host,
__in DWORD hostlen,
__out char FAR *serv,
__in DWORD servlen,
__in int flags
);
它得到更多的參數......而我很困惑,我只需要它工作,因爲gethostbyname工作。通過什麼參數來保持它簡單愚蠢,因爲它與gethostbyname?
最後,這裏是我的嘗試:
struct sockaddr_in servAddr;
struct hostent *host; /* Structure containing host information */
/* open socket */
if ((handle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
return LILI_ERROR;
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(address.ptr());
servAddr.sin_port = htons(port);
char servInfo[NI_MAXSERV];
if ((host = (hostent*) getnameinfo(
(struct sockaddr *) &servAddr
,sizeof (struct sockaddr)
,address.ptr(), address.size()
,servInfo, NI_MAXSERV
,NI_NUMERICHOST | NI_NUMERICSERV) ) == 0)
return LILI_ERROR;
if (::connect(handle, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
return LILI_ERROR;
它編譯良好,在啓動時沒有分割的錯,但我不能用它在我的服務器連接:(
當你用[tag:C++]標記問題時,我建議使用[boost.asio](http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio.html) 。 – Griwes 2012-04-27 07:04:15
謝謝。但我不想觸摸提升。但我認爲沒有理由不使用提升,所以我想我會看看。 – Cynede 2012-04-27 07:07:22
https://www.google.com/search?btnG=1&pws=0&q=winsock+getnameinfo+tutorial 編號3. – dutt 2012-04-27 07:22:16