Apple の TCPServer クラスを使用して、着信接続からリッスンするときにソケットを開きます。誰かがリッスン ソケットに接続したときに呼び出されるコールバックを次に示します。
static void TCPServerAcceptCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
TCPServer *server = (TCPServer *)info;
if (kCFSocketAcceptCallBack == type) {
// for an AcceptCallBack, the data parameter is a pointer to a CFSocketNativeHandle
CFSocketNativeHandle nativeSocketHandle = *(CFSocketNativeHandle *)data;
uint8_t name[SOCK_MAXADDRLEN];
socklen_t namelen = sizeof(name);
NSData *peer = nil;
if (0 == getpeername(nativeSocketHandle, (struct sockaddr *)name, &namelen)) {
peer = [NSData dataWithBytes:name length:namelen];
}
CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle, &readStream, &writeStream);
if (readStream && writeStream) {
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
[server handleNewConnectionFromAddress:peer inputStream:(NSInputStream *)readStream outputStream:(NSOutputStream *)writeStream];
} else {
// on any failure, need to destroy the CFSocketNativeHandle
// since we are not going to use it any more
close(nativeSocketHandle);
}
if (readStream) CFRelease(readStream);
if (writeStream) CFRelease(writeStream);
}
}
接続しているデバイスのホスト名を取得する方法はありますか? よろしく、コサ
[編集] IPを抽出するために次のようなことを試しました:
struct sockaddr_in *s = (struct sockaddr_in*)name;
char *ipstr = malloc(INET_ADDRSTRLEN);
ipstr = inet_ntoa(s->sin_addr);
NSLog(@"ip = %s", ipstr);
しかし、それは私に0.0.0.0を与えます。
[編集] まだ取り組んでいますが、まだ成功していません。アップルのドキュメントによると、アドレスパラメータは次のとおりです。
s のプロトコル ファミリ (たとえば、struct sockaddr_in または struct sockaddr_in6) に適した struct sockaddr の内容を保持し、s が接続されているリモート アドレスを識別する CFData オブジェクト。この値は、kCFSocketAcceptCallBack および kCFSocketDataCallBack コールバックを除いて NULL です。
ただし、132.20.0.1 以外の IP を抽出することはできません (これは明らかに私が期待している IP ではありません)。