我试图获取套接字的端口号,而不调用bind()。
代码如下。
#include <arpa/inet.h>
#include <unistd.h>
#include <cstdio>
int main() {
int sock = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1) {
perror("getsockname");
} else {
printf("port number %d\n", ntohs(sin.sin_port));
}
}
它总是打印“端口号0”。
必须调用bind()才能使用getsockname()吗?我在网上看到类似的声明,但找不到可靠的声明。
最佳答案
从手册页:
函数的作用是:检索指定套接字的本地绑定名,
(...)
如果套接字尚未绑定到本地名称,则未指定由地址指向的对象中存储的值。
从POSIX getsockname开始,黑体是我的。
所以是的,你需要把插座绑起来。