题 套接字 - 如何找出我分配的端口和地址


我无法解决这个问题 - 我正在使用本指南使用C语言中的套接字 - http://binarii.com/files/papers/c_sockets.txt

我正在尝试自动获取我的ip和端口使用:

server.sin_port = 0;              /* bind() will choose a random port*/
server.sin_addr.s_addr = INADDR_ANY;  /* puts server's IP automatically */
...
...
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function

成功绑定后,如何找出实际分配的IP和端口?


30
2017-10-28 19:47


起源


实际上,当你指定时会发生什么 INADDR_ANY 并不是它自动将服务器的IP放入其中,它所做的是查找所有接口,并绑定到它们中的每一个。因此,您对问题有很多正确的答案。 - jer
嗯 - 谢谢你。我正在处理的一项任务要求我使用指定的代码自动获取IP和端口,但我要打印服务器地址和端口,以便客户端连接到屏幕上。这就是我想弄清楚该怎么做的原因。如果我使用sockaddr结构,我只得到0.0.0.0和端口0。 - stringo0
看到 stackoverflow.com/questions/2496302/... - mark4o
实际上它并没有'绑定到它们中的每一个'。它没有绑定 任何 他们而是它告诉堆栈 好像 它必然会 所有 他们这就是为什么它被称为INADDR_ANY。 - user207421


答案:


如果它是服务器套接字,你应该打电话 listen() 在你的套接字上,然后 getsockname() 找到它正在侦听的端口号:

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));

至于IP地址,如果你使用 INADDR_ANY 然后服务器套接字可以接受任何机器的IP地址的连接,服务器套接字本身没有特定的IP地址。例如,如果您的计算机有两个IP地址,那么您可能会在此服务器套接字上获得两个传入连接,每个连接具有不同的本地IP地址。您可以使用 getsockname() 在特定连接的套接字上(您可以从中获取) accept())以便找出在该连接上使用的本地IP地址。


64
2017-10-28 23:06



谢谢mark4o - 这很棒!但是我仍然无法获得地址 - 我仍然得到0.0.0.0 - 任何想法?谢谢! - stringo0
服务器套接字没有特定的IP地址,并且计算机可能具有多个IP地址。如果您只想获得机器的其中一个地址,请查看其他问题: stackoverflow.com/questions/212528/... - mark4o
谢谢 - gethostname做了诀窍:) - stringo0
感谢您提供此代码示例。如果有人对sock是什么感到困惑,那么它就是套接字的文件描述符。 - JustinDanielson
请注意,您不必实际呼叫 listen,这应该适用于TCP和UDP套接字,只要它们首先被绑定。 - Andrew Sun


您的代码中的注释是错误的。 INADDR_ANY 没有自动放置服务器的IP'。它本质上是 0.0.0.0,由于在mark4o中解释的原因 回答


5
2017-10-29 11:42