2

私は iOS/MacOS プログラミングが初めてで、理解できる例が見つかりません。これを行うには数行のコードしかないと思うので、これがすでにカバーされている場合は申し訳ありませんが、私の人生では見つけることができません。

CFStreamCreatePairWithSocketToHost を使用してイン/アウト ストリームを作成しています。ローカル エンドポイント情報を取得したいだけです (具体的には IP アドレス、実際にはポートは気にしません)。既にサーバーからパブリック IP 情報を取得していますが、セキュリティ/ログの理由から、ローカル アドレスも必要です。

これは、問題がある場合、MacOS ではなく iOS にあります。

4

1 に答える 1

7

次のコードは、ローカル ソケット アドレスを取得する方法を示しています。IPv4 および IPv6 アドレスで動作します。(それは数行以上です。おそらく誰かがより短い解決策を知っています。)

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

// Create socket pair:
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStringRef remoteHost = CFSTR("localhost");
CFStreamCreatePairWithSocketToHost(NULL, remoteHost, 5555, &readStream, &writeStream);

// Write something (the socket is not valid before you read or write):
CFWriteStreamOpen(writeStream);
CFWriteStreamWrite(writeStream, "Hello\n", 6);

// Get the native socket handle:
CFDataRef socketData = CFWriteStreamCopyProperty(writeStream, kCFStreamPropertySocketNativeHandle);
CFSocketNativeHandle socket;
CFDataGetBytes(socketData, CFRangeMake(0, sizeof(CFSocketNativeHandle)), (UInt8 *)&socket);

// Get the local socket address from the socket handle:
struct sockaddr_storage sa;
socklen_t salen = sizeof(sa);
getsockname(socket, (struct sockaddr *)&sa, &salen);

// Get numeric host and port from socket address:
char host[NI_MAXHOST];
char service[NI_MAXSERV];
getnameinfo((struct sockaddr *)&sa, salen, host, sizeof(host), service, sizeof(service), NI_NUMERICHOST|NI_NUMERICSERV);

NSLog(@"local address: %s, local port: %s", host, service);
于 2012-10-05T18:21:32.713 に答える