のgetaddrinfoの定義は()である:なぜgetaddrinfo()は関数の入力部分の値を返しますか?
int getaddrinfo(const char *node, // e.g. "www.example.com" or IP
const char *service, // e.g. "http" or port number
const struct addrinfo *hints,
struct addrinfo **res);
パーBeejのsiteそれは言う:
「、解像度、あなたがこの機能に3つの入力パラメータを与え、そしてそれはあなたのリンクリストへのポインタを与えます結果の。
使用量の面では、次のとおりです。
if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
// loop through all the results and bind to the first we can
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("server: socket");
continue;
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
perror("server: bind");
continue;
}
break;
}
実際の戻り値「rv」は、実際に使用されることはありません。しかし、結果は第4入力 "res"またはこの例の "servinfo"から取られます。私は、リンクされたリストが関わっていることを理解していますが、関数の戻り値が通常の方法で動作しない理由は明らかではありません。なぜ "rv"はアドレスを取得するために反復される配列ではないのですか?入力が結果を返すのはなぜですか?
非常によく見ると、第2行目で 'rv'が実際に使用されています。それが 'gai_seterror'に渡されたときに、エラーメッセージをユーザにフォーマットして、呼び出しが失敗した理由を示します。 – selbie
C *で参照渡しをエミュレートする方法についていくつかの調査を行います。 –
サードパーティのサイトを参照として引用することはできません。あなたは* man * pageに相談することを検討しましたか? – EJP