我正在用C语言编写一个简单的FTP服务器程序。我主要遵循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 */
这到底是什么?这是预期的吗?如果没有,我在哪里做错了?
谢谢。
编辑:
显然,它所打印的内容有所不同。
它没有定义为:
#define AF_ATM 30 /* ATM */
但是它定义为:
MT IPv6: Multi-Topology IP version 6 [RFC7307]