2012-10-05 61 views
2

我是iOS/MacOS編程的新手,並沒有找到任何我理解的示例。我想這只是幾行代碼來做到這一點,所以很抱歉,如果這已被覆蓋,但對於我的生活,我無法找到它。CFStreamCreatePairWithSocketToHost獲取本地端點地址

我正在使用CFStreamCreatePairWithSocketToHost來創建輸入/輸出流。我只想獲得本地端點信息(特別是IP地址,實際上並不關心端口)。我已經從我的服務器獲取公共IP信息,但出於安全/記錄的原因,我也需要本地地址。

這是在iOS上,而不是MacOS,如果它很重要。

回答

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); 
+0

非常感謝,正是我所需要的!現在我也知道如何獲得本地套接字句柄來處理任何我可能需要的東西。直到一些數據包回來後,我才需要這些信息,但是直到I/O完成才知道套接字是無效的。 – eselk