我试图获取套接字的端口号,而不调用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开始,黑体是我的。
所以是的,你需要把插座绑起来。

09-28 04:48