int print_socket_info(int sock_fd, struct sockaddr_in *sin, short protocol){
char dbg[INET_ADDRSTRLEN];
char *famstr;
inet_ntop(protocol, &(sin->sin_addr), dbg, INET_ADDRSTRLEN);
printf("============ SOCKET INFORMATION =============\n");
printf("!** socket: %d\n", sock_fd);
printf("!** info->ai_addr: sockaddr_in(\n");
famstr = fam2str(sin->sin_family);
printf("!** sin_family: %s\n", famstr);
printf("!** sin_port: %d\n", ntohs(sin->sin_port));
printf("!** sin_addr: in_addr( s_addr : '%s' )\n", dbg);
printf("!**)\n");
printf("=============================================\n");
return 1;
}
char *fam2str(int fam){
switch (fam){
case AF_INET:
return "AF_INET";
case AF_INET6:
return "AF_INET6";
case AF_UNSPEC:
return "AF_UNSPEC";
default:
return "(UNKNOWN)";
}
return "(UNKNOWN)";
}
次のように Hint.ai_addr を渡すと (情報を無視します->...文字列の一部です):
print_socket_info(sock, (struct sockaddr_in *)hint.ai_addr, protocol);
...次に、次の出力を取得します...
============ SOCKET INFORMATION =============
!** socket: 3
!** info->ai_addr: sockaddr_in(
!** sin_family: AF_INET6
!** sin_port: 8081
!** sin_addr: in_addr( s_addr : '::1' )
!**)
=============================================
... 情報が正しく印刷されます。次に、関数を呼び出します。
res = getaddrinfo(target_host, target_port, &hint, &info);
これまでのところエラーは発生しません。ここで、リンクされたリストをループします。
struct addrinfo *rp;
for (rp = info; rp != NULL; rp = rp->ai_next){
printf("==> Another element.\n");
print_socket_info(sock, (struct sockaddr_in *) rp->ai_addr, protocol);
}
... 要素を 1 つだけ出力します。
============ SOCKET INFORMATION =============
!** socket: 3
!** info->ai_addr: sockaddr_in(
!** sin_family: AF_INET6
!** sin_port: 8081
!** sin_addr: in_addr( s_addr : '::' )
!**)
=============================================
もちろん、これは bind() で大混乱を引き起こしています。なぜ住所が短縮されたのですか?
その他の奇妙な点: 127.0.0.1 を渡して AF_INET4 を使用すると、アドレスはプログラム全体で維持されます (ただし、結果は 1 つしか得られず、バインドは失敗します)。
何か案は?前もって感謝します。