【问题标题】:AsyncSocket WHOIS connectAsyncSocket WHOIS 连接
【发布时间】: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]);
}

帮忙?!

【问题讨论】:

    标签: objective-c ios asyncsocket


    【解决方案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 进程是一个需要两个连续套接字调用的两步过程),就会出现此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多