2010-10-28 60 views
29

我无法搞清楚了这一点 - 我使用本指南与插座的工作用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和端口?

+0

实际上,当你指定INADDR_ANY时,发生的事情并不是它自动放置服务器的IP,它所做的是找到所有接口,并绑定到它们中的每一个。因此,你有很多正确的答案来解决你的问题。 – jer 2010-10-28 19:50:34

+0

恩 - 谢谢你。我正在处理的任务要求我使用指定的代码自动获取IP和端口,但我要打印服务器地址和端口以供客户端连接到屏幕上。这是我想要弄清楚如何去做的。如果我使用sockaddr结构体,我只能得到0.0.0.0和端口0. – stringo0 2010-10-28 19:52:59

+1

请参阅http://stackoverflow.com/questions/2496302/how-can-i-obtain-the-local-tcp-port-and-ip - 我的客户端程序的地址 – mark4o 2010-10-28 19:55:20

回答

60

如果它是一个服务器套接字,你应该打电话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地址。

+0

谢谢mark4o - 这很好!但是我仍然无法获得地址 - 我仍然得到0.0.0.0 - 任何想法?谢谢! – stringo0 2010-10-28 23:41:05

+1

服务器套接字没有特定的IP地址,机器可能有多个IP地址。如果你只是想得到一台机器的地址,看看这个其他问题:http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer – mark4o 2010-10-28 23:53:17

+1

谢谢 - gethostname做了诀窍:) – stringo0 2010-10-29 20:13:31

4

代码中的注释错误。 INADDR_ANY不自动放置服务器的IP'。它基本上将0.0.0.0,出于mark4o的answer中解释的原因。

+0

现在有很多意义。谢谢! – stringo0 2010-10-29 20:13:50