AsyncSocket WHOIS 连接

Posted

技术标签:

【中文标题】AsyncSocket WHOIS 连接【英文标题】:AsyncSocket WHOIS connect 【发布时间】:2011-12-01 03:46:11 【问题描述】:

我正在尝试使用 GCDAsyncSocket 连接到 WHOIS 服务器 (com.whois-servers.net:43)。我可以连接并写入服务器并调用didWriteDataWithTag:,但没有数据。 WHOIS 服务器确实发送了响应,但我无法阅读。

NSLog(@"Connecting to \"%@\" on port %hu...", host, port);
    self.viewController.label.text = @"Connecting...";

    NSError *error = nil;
    if (![asyncSocket connectToHost:@"com.whois-servers.net" onPort:43 error:&error])
    
        DDLogError(@"Error connecting: %@", error);
        self.viewController.label.text = @"Oops";
    

    NSString *requestStr = [NSString stringWithFormat:@"domain google.com\r\n\r\n"];
    NSData *requestData = [requestStr dataUsingEncoding:NSUTF8StringEncoding];

    [asyncSocket writeData:requestData withTimeout:-1 tag:0];
    [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];

这里是didReadData:

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
    DDLogInfo(@"socket:%p didReadData:withTag:%d", sock, tag);
    NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"Data: %i", [data length]);

帮忙?!

【问题讨论】:

【参考方案1】:

我在使用 AsyncSocket 时遇到了同样的问题。我从来没有完全解决它,但找到了一个接近的解决方案。

onSocket:willDisconnectWithError(GapSocketCommand.m)中可以通过调用unreadData获取连接失败时的当前缓冲区。

- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err

NSLog(@"onSocket:willDisconnectWithError %@",err);
NSData * unreadData = [sock unreadData]; // ** This gets the current buffer

if(unreadData) 
    [self onSocket:sock didReadData:unreadData withTag:NULL]; // ** Return as much data that could be collected
 else 
    NSString* jsString = [[NSString alloc] initWithFormat:@"GapSocket.__onError(\"%d\",\"%@\");"
                      ,[sock userData]
                      ,[err localizedDescription] ];
    [self.webView stringByEvaluatingjavascriptFromString:jsString];
    //[jsString release];


您必须修改它以应用于 GCDAsyncSocket,但解决方案应该是相同的。

【讨论】:

谢谢。我真的把它修好了。原来我已经包含了 GCDAsyncSocket.h 两次并导致它不调用函数。但是,如果我再次尝试调用它(在 .com、.net 中,whois 进程是一个需要两个连续套接字调用的两步过程),就会出现此问题。

以上是关于AsyncSocket WHOIS 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何修复此错误(“_OBJC_CLASS_$_AsyncSocket”,引用自:)

如何检测 ASyncSocket 中的远程断开连接

AsyncSocket 连接仅适用于家庭网络

ios 9 中的 Asyncsocket 错误 - 在连接或接受连接时尝试连接。先断开

iOS开发之即时通讯之Socket(AsyncSocket)

iOS--(转)socket编程之Asyncsocket详解