【发布时间】:2012-06-21 12:59:43
【问题描述】:
我正在使用 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。
[编辑] 仍在努力,但仍然没有成功。根据苹果的文档地址参数是:
一个 CFData 对象,它包含适合于 s 协议族(例如 struct sockaddr_in 或 struct sockaddr_in6)的 struct sockaddr 的内容,标识 s 连接到的远程地址。除 kCFSocketAcceptCallBack 和 kCFSocketDataCallBack 回调外,此值为 NULL。
但是我无法提取除 132.20.0.1 之外的任何其他 IP(这显然不是我期望的 IP)我真的很困惑,如果有人能帮助我,那就太好了!
【问题讨论】:
-
TCPServer定义在哪里? -
TCPServer 是持有这个静态方法的类。它可以在 iOS 开发中心的“witap”示例项目中找到。
-
这个回调在哪里使用?我只能看到
TCPServerDelegate的使用。 -
:“[服务器 handleNewConnectionFromAddress:peer inputStream:(NSInputStream *)readStream outputStream:(NSOutputStream *)writeStream];”调用委托方法。你知道是否有办法从这里获取传入连接的主机名?其余代码不包含任何有用的东西来获取它。
标签: objective-c ios sockets hostname tcpserver