3

これをアドレスとして使用して、新しいサーバーを作成しました(、、socket()):bind()listen()

struct sockaddr_in newServer;
memset(&newServer, 0, sizeof(newServer));
newServer.sin_family = AF_INET;
newServer.sin_addr.s_addr = htonl(INADDR_ANY);
newServer.sin_port = htons(UNUSED_PORT);

マクロUNUSED_PORTは0として定義されています。

サーバーが任意のインターフェイスと未使用のポートでリッスンすることを期待しています。

ローカルIPアドレスとポートを取得するために使用しようとしましgetsockname()たが、奇妙な出力がいくつか得られました。以下のような出力コード:

struct sockaddr_in localAddress;
socklen_t addressLength;
getsockname(newServerfd, (struct sockaddr*)&localAddress,   \
                &addressLength);
printf("local address: %s\n", inet_ntoa( localAddress.sin_addr));
printf("local port: %d\n", (int) ntohs(localAddress.sin_port));

たとえば、0.255.255.255:0、0.0.0.0:0、255.127.0.0:36237などを取得し、システムはMac OSX10.7.3です。

- アップデート -

socklen_t addressLength = sizeof(localAddress);(@cnicutarと@Jonathan Lefflerのおかげで)使用した後、ローカルIPに対して常に0.0.0.0を取得します。大丈夫ですか?

4

1 に答える 1

6

addressLength呼び出す前に初期化する必要がありますgetsockname

socklen_t addressLength = sizeof(localAddress);
于 2012-04-16T00:54:53.663 に答える