UDP套接字的发件人IP /端口

是否可以通过C套接字获取发送方IP和(动态获取)端口? 我有以下内容:

memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; if ((rv = getaddrinfo(NULL, DATABASEPORT, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); exit(1); } for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("socket"); continue; } break; } 

这几乎是从指南中获取的(虽然我有点得到它?)。 但我无法确定哪些信息可用于查找客户数据。

任何和所有的帮助表示赞赏,谢谢!

通常你会获得带有getsockname(2)的本地地址/端口信息,但是在这里你还没有 – 套接字没有连接,也没有发送任何东西。 如果这是一个简单的UDP客户端 – 考虑使用连接的UDP套接字 – 您可以在connect(2)之后立即看到本地IP /端口。

对于未连接的UDP套接字,无法获取本地地址。 您当然可以通过使用recvfrom而不是read / recv来读取数据包来获取远程地址。 如果您只与单个服务器通信,请继续使用connect 。 如果您需要与多个服务器通信,您可能只需要在其中一个服务器上进行虚拟connect (在新的套接字上)以获取本地地址,但是可以(如果主机使用非平凡路由)连接到不同的远程主机将导致不同的本地地址。 如果同时连接到localhost127.0.0.1 )和远程服务器,这甚至可以在相当简单的环境中发生。