Linux 不带bind()的getsockname()

Linux 不带bind()的getsockname(),linux,sockets,network-programming,unix-socket,Linux,Sockets,Network Programming,Unix Socket,我正在尝试获取套接字的端口号,而不调用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 (get

我正在尝试获取套接字的端口号,而不调用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));
  }
}
#包括
#包括
#包括
int main(){
int sock=socket(AF_INET,sock_DGRAM | sock_CLOEXEC,0);
sin中的结构sockaddr_;
socklen_t len=sizeof(sin);
if(getsockname(sock,(struct sockaddr*)和sin,&len)=-1){
perror(“getsockname”);
}否则{
printf(“端口号%d\n”,ntohs(sin.sin_端口));
}
}
它总是打印“端口号0”

是否必须调用bind()才能使用getsockname()?我在网上看到了类似的声明,但我找不到可靠的声明

从手册页:

getsockname()函数应检索指定套接字的本地绑定名

(……)

如果套接字未绑定到本地名称,则存储在地址指向的对象中的值是未指定的

从我这里,你是我的

因此,是的,您需要绑定套接字