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

str*_*go0 38 c sockets tcp

我无法解决这个问题 - 我正在使用本指南使用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
Run Code Online (Sandbox Code Playgroud)

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

mar*_*k4o 71

如果它是服务器套接字,您应该调用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));
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您提供此代码示例.如果有人对sock是什么感到困惑,那么它就是套接字的文件描述符. (6认同)
  • 请注意,您不必实际调用 `listen`,只要先绑定 TCP 和 UDP 套接字,这应该适用于它们。 (3认同)

use*_*421 5

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