Я пишу простую программу на 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]