Какое семейство адресов сокетов определяется как 30? - PullRequest
0 голосов
/ 28 марта 2019

Я пишу простую программу на FTP-сервере на C. Я в основном следую Руководству Beej по сетевому программированию. Чтобы завершить работу режима pasv, мне нужно создать еще один сокет и отправить его ip и порт клиенту.

Так как gethostbyname () устарела, я использую getsockname () для получения моего текущего сетевого IP-адреса. Мой план состоит в том, чтобы я разделил два случая (ipv4 и ipv6) и соответственно отправил информацию клиенту. Но всякий раз, когда я пытаюсь получить семейство адресов, это всегда 30. Я не уверен, правильно ли я печатаю это.

Я делаю что-то простое, как это (которое может включать ошибки), и оно печатает 30.

struct sockaddr_storage my_addr;
int result;
socklen_t len = sizeof(my_addr);

result = getsockname(current_fd, (struct sockaddr *) &my_addr, &len);

if (my_addr.ss_family == AF_INET) { // ipv4
        struct sockaddr_in * ipv4 = (struct sockaddr_in *) &my_addr;
        addr = &(ipv4->sin_addr);
} else { // ipv6
        struct sockaddr_in6 * ipv6 = (struct sockaddr_in6 *) &my_addr;
        addr = &(ipv6->sin6_addr);
}

printf(" family: %u\n", (unsigned short) my_addr.ss_family);

Когда я искал это онлайн, я получил:

#define AF_ATM 30 /* ATM */

Что это такое? Это ожидается? Если нет, то где я делаю что-то не так?

Спасибо.

Edit:

Видимо, то, что печаталось, было чем-то другим.

Он не определяется как: #define AF_ATM 30 /* ATM */ но это определяется как: MT IPv6: Multi-Topology IP version 6 [RFC7307]

...