web-dev-qa-db-ja.com

ソケット-割り当てられているポートとアドレスを確認する方法

私はこれを理解するのに問題があります-私はこのガイドを使用して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とポートを確認するにはどうすればよいですか?

37
stringo0

サーバーソケットの場合は、ソケットで 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アドレスがありません。たとえば、マシンに2つのIPアドレスがある場合、このサーバーソケットで、それぞれ異なるローカルIPアドレスを持つ2つの着信接続を取得できます。特定の接続(getsockname()から取得)のソケットでaccept()を使用して、その接続で使用されているローカルIPアドレスを見つけることができます。

69
mark4o

コード内のコメントが間違っています。 INADDR_ANYは、サーバーのIPを自動的に配置しません。 mark4oの answer で説明されている理由により、本質的に0.0.0.0を置きます。

5
user207421