【问题标题】:NSInputStream can't read from TCP Connection [TCP-Server]NSInputStream 无法从 TCP 连接 [TCP-Server] 读取
【发布时间】:2013-07-25 13:43:19
【问题描述】:

我使用this (quite old) example by Apple 创建了一个 TCP 服务器。我的服务器已启动并正在运行,正在侦听指定端口的传入连接。

一切看起来都很完美,我的客户端应用程序可以连接到服务器并按预期调用-stream:handleEvent:

但是当我现在写入流时,服务器会拒绝我的连接。客户端说30字节写入成功。

但我的日志说:

did read 0 Bytes from inputStream.
data received: 
NSStreamEventErrorOccurred
Error: Error Domain=NSPOSIXErrorDomain code=14 "The operation couldn't be completed. Bad address"

在客户端,我使用以下代码建立连接:

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"10.0.10.40", 58896, &readStream, &writeStream);

_iStream = (__bridge NSInputStream *)readStream;
_oStream = (__bridge NSOutputStream *)writeStream;

[_iStream setDelegate:self];
[_oStream setDelegate:self];

[_iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[_iStream open];
[_oStream open];

在服务器端这会创建套接字(提供了 CFSocketCallBack)

_IPv4Socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAcceptCallBack, (CFSocketCallBack)&JWTCPServerAcceptCallBack, nil);

然后在回调中我使用这个配对:

CFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle, &readStream, &writeStream);
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

然后将流桥接到 NSStreams,设置委托,在当前运行循环中调度并打开它们。

我不太清楚为什么会发生这种情况,所以我不在这里提供整个服务器代码。实在是太过分了。

当你需要一段特定的代码或猜测它可能是什么原因时,我会在此处发布相应的代码。

更新

我现在对自己的代码进行了大量研究。我将问题追溯到我的-stream:handleEvent 方法调用。

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
    uint8_t *buffer = NULL;
    NSMutableData *receivedData;

    switch(eventCode) {
        case NSStreamEventHasBytesAvailable:

        if(aStream == _iStream) {
            receivedData = [NSMutableData data];

            while([_iStream read:buffer maxLength:1] > 0) {
            //    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ THIS RETURNS -1
                if([[[NSString alloc] initWithBytes:buffer length:sizeof(buffer) encoding:NSUTF8StringEncoding] isEqualToString:@"\n"]) {
                    break;
                }

                [receivedData appendBytes:buffer length:sizeof(buffer)];
            }

             NSLog(@"Did receive %li Bytes of data: %@", [receivedData length], [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]);
        } 
    }
}

更新 2

我阅读了this great Apple Article 关于 TCP 服务器和客户端的信息。我完成了所有步骤,我的程序几乎与 Apple 提供的代码相同。问题依然存在。

【问题讨论】:

    标签: sockets tcp nsstream nsinputstream nsoutputstream


    【解决方案1】:

    我找到了解决方案!实际上我是在声明缓冲区完全错误。所以错误消息所指的地址不是网络地址,正如我所想的那样......

    uint8_t *buffer = NULL;
    

    必须变成

    uint8_t buffer[1];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2018-06-28
      • 2019-04-02
      相关资源
      最近更新 更多