c - 如何从 unix c 中的 struct addrinfo 获取端口号

标签 c network-programming udp sockets

我需要在特定端口通过 UDP 将一些数据发送到远程服务器并从中接收响应。但是,它正在阻塞,我没有得到任何回应。我需要检查从 getaddrinfo(SERVER_NAME, port, &hints, &servinfo) 获取的 addrinfo 值是否正确。

如何从这个数据结构中获取端口号?

我知道 inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof s) 给我服务器 IP 地址。 (我使用的是 Beej 指南中的方法。)

最佳答案

您执行类似于 Beej 的 get_in_addr 函数的操作:

// get port, IPv4 or IPv6:
in_port_t get_in_port(struct sockaddr *sa)
{
    if (sa->sa_family == AF_INET)
        return (((struct sockaddr_in*)sa)->sin_port);

    return (((struct sockaddr_in6*)sa)->sin6_port);
}

还要注意处理端口号的第一个陷阱 sockaddr_in (或 sockaddr_in6 )结构:端口号始终以网络字节顺序存储。

这意味着,例如,如果您打印出 get_in_port() 的结果在上面调用,你需要输入 ntohs() :

printf("port is %d\n", ntohs(get_in_port((struct sockaddr *)p->ai_addr)));

关于c - 如何从 unix c 中的 struct addrinfo 获取端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2371910/

相关文章:

c - 使用我自己的 strcopy 函数时变空

c - net-snmp解析代码,如何解析MIB?

C++ UDP 在一个类中接收一个 vector

c - 二分查找和排序 - CS50 查找 pset3

c - 我必须通过递归检查一个数字是否是回文

c - 我如何知道我的 args[] 字符串是否为 char 类型?

java - Android:让应用程序通过网络(在其他手机上)向另一个应用程序发送请求

networking - 如何模拟不同的NAT行为

python - 如何在打印消息时删除 'b' 前缀?

c++ - 过滤来自特定 IP 的 UDP 数据包