【问题标题】:AsycnSocket not connecting to TCP serial port over wifi异步套接字未通过 wifi 连接到 TCP 串行端口
【发布时间】:2011-12-10 05:23:53
【问题描述】:

我有一个在模拟器上运行的 iPhone 应用程序。 XCode 版本 3.2.6/4.3。我正在尝试通过 wifi 与 PC 的串行端口上的无线电通信,两者都在同一台服务器上......我尝试了 NSStream 和 GCDAsyncSocket (只是为了确保)。无线电有自己的 IP 地址和端口号。它实际上是一个 TCP/IP wifi 模块。在将 PC 上的远程访问更改为接受我的 IP 地址后,我终于能够连接,但我立即被启动,我假设这是我尝试读取或写入的时候。使用 Telnet 时也会发生同样的情况,连接然后断开连接。当有人连接时,无线电会发出 HELLO,因此 Telnet 必须尝试读取,因为数据已发送。我正在猜测。我想既然我能够连接,我应该能够读/写。 (是的,这里是新手)

如果有任何想法或方向,我将不胜感激。我已经研究了一个多星期了,而且开始发疯了。

谢谢。我添加了下面的代码以及错误消息。

这是错误信息: socketDidDisconnect:withError:“错误域=NSOSStatusErrorDomain Code=-9844 "操作无法完成。(OSStatus错误 -9844.)" UserInfo=0x4c38a60 {}"

- (IBAction)performConnection:(id)sender 
{
    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];   
    NSError *error = nil;
    uint16_t port = [[[self serverPort] text] intValue];

    if (![asyncSocket connectToHost:[serverAddr text] onPort:port error:&error])
    {
        DDLogError(@"Unable to connect due to invalid configuration: %@", error);
        [self debugPrint:[NSString stringWithFormat:@"Unable to connect due to invalid configuration: %@", error]];
    }
    else
    {
        DDLogVerbose(@"Connecting...IP:%@, port:%i", [serverAddr text], port);
    }   
}

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
    DDLogInfo(@"socket:%p didConnectToHost:%@ port:%hu", sock, host, port);

    NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3];
    [settings setObject:@"XXX.XXX.X.XXX"
             forKey:(NSString *)kCFStreamSSLPeerName];

    // In fact, don't even validate the certificate chain
    [settings setObject:[NSNumber numberWithBool:NO]
             forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];
    [settings setObject:(NSString*)kCFStreamPropertySocketSecurityLevel
             forKey:(NSString*)kCFStreamSocketSecurityLevelNegotiatedSSL];

    DDLogVerbose(@"Starting TLS with settings:\n%@", settings);

    [sock startTLS:settings];

    [self debugPrint:[NSString stringWithFormat:@"socket:didConnectToHost:%@ port:%hu", host, port]];

    //[sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0]; 
    [sock readDataWithTimeout:-1 tag:0];

}

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
    DDLogVerbose(@"socket:didWriteDataWithTag:");
    [sock readDataWithTimeout:-1 tag:0];

}


- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    DDLogVerbose(@"socket:didReadData:withTag:");

    NSString *response = [[NSString alloc] initWithData:data  encoding:NSASCIIStringEncoding];
    NSLog(@"read response:%@", response);
    [self debugPrint:[NSString stringWithFormat:@"Read:  \n%@",response]];
    [response release];

    //NSData *newline = [@"\n" dataUsingEncoding:NSASCIIStringEncoding]; 
    //[sock readDataToData:newline withTimeout:-1 tag: 0]; 
    [sock readDataWithTimeout:-1 tag:0];

}

- (IBAction)sendBuf:(id)sender 
{
    if ([[bufOut text] length] > 0) 
    {
            NSString *requestStr = [NSString stringWithFormat:@"%@\r\n", [bufOut text]];
        NSLog(@"Sending:%@",requestStr);
        NSData *requestData = [requestStr dataUsingEncoding:NSASCIIStringEncoding];
        [asyncSocket writeData:requestData withTimeout:-1.0 tag:0];
        [self debugPrint:[NSString stringWithFormat:@"Sent:  \n%@",requestStr]];
    }

}

【问题讨论】:

  • 我认为你应该添加一些代码来举例说明

标签: iphone ssl tcp asyncsocket


【解决方案1】:

我找到了部分解决方案(纯属偶然)。似乎收音机或收音机的设置方式仅允许我在我的应用程序或 iMac 启动连接时进行连接/读/写。用另一台电脑就好了。两者都可以启动连接并且一切正常。仍然需要解决这个问题,但至少我知道我的代码正在运行。 感谢任何考虑过我的问题的人。

【讨论】:

    猜你喜欢
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2014-05-02
    • 2015-11-27
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多