cnd*_*cnd 15 c++ sockets gcc warnings cross-compiling
在代码中:
if ((host = (struct hostent*) gethostbyname(address) ) == 0) // address is a string
Run Code Online (Sandbox Code Playgroud)
在4.5.x gcc上进行交叉编译(通用arm架构)时,我收到了警告:
(.text+0x1558): warning: gethostbyname is obsolescent, use getnameinfo() instead.
Run Code Online (Sandbox Code Playgroud)
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
);
Run Code Online (Sandbox Code Playgroud)
它有更多参数......而且我对它感到困惑,我只需要它就像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;
Run Code Online (Sandbox Code Playgroud)
它编译得很好,启动时没有分段错误,但我无法连接我的服务器:(
Rob*_*mer 13
gethostbyname()做一个名字→IP查找.它应该被替换getaddrinfo(),它可以做同样的事情.
这意味着警告完全错误.getnameinfo()取代了gethostbyaddr(),用于IP→名称查找.相反.
名称→IP:gethostbyname(),getaddrinfo()
IP→名称:gethostbyaddr(),getnameinfo()
较新的功能可以做得更多:它们处理IPv6 并且可以将像'http'这样的字符串转换为80(端口).在未来,他们还可以确定是否应将TCP用于相关服务或SCTP.界面准备就绪.
Seb*_*ler 11
Beej's解释得非常好.gethostbyname()与IPV6不兼容,因此您应该使用getnameinfo().您所要做的就是填写所需的信息,即
getnameinfo(
&sa, // Pointer to your struct sockaddr
sizeof sa, // Size of this struct
host, // Pointer to hostname string
sizeof host, // Size of this string
service, // Pointer to service name string
sizeof service, // Size of this string
0 // No flags given
);
Run Code Online (Sandbox Code Playgroud)
编辑:经过一番研究,我发现了
getnameinfo(&sa, sizeof(sa), hostname, size_hostname, NULL, NULL, 0);
Run Code Online (Sandbox Code Playgroud)
应该足够了.
编辑#2我注意到你正在尝试使用返回值getnameinfo作为主机名.但这不正确,主机名保存在提供的host指针中.返回值表示操作是否足够.另请参阅手册页.
| 归档时间: |
|
| 查看次数: |
24624 次 |
| 最近记录: |