2013-07-25 37 views
1

我使用this (quite old) example by Apple创建了一个TCP服务器。我的服务器已启动并正在运行,在指定的端口上监听传入的连接。NSInputStream无法从TCP连接读取[TCP-Server]

一切都看起来很完美,我的客户端应用程序可以连接到服务器,并按预期调用-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,设置委托,安排在当前runloop并打开它们。

我不太确定为什么会出现这种情况,所以我不提供整个服务器代码。这太简单了。

当你需要一段特定的代码或猜测它可能导致的位置时,我会在这里发布相应的代码。

UPDATE

我现在做了很多的研究,我自己的代码。我将问题追踪到我的-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提供的代码几乎完全相同。问题依然存在。

回答

2

我找到了解决方案!其实我是在宣布缓冲区完全错误。因此,该错误消息意味着地址不是一个网络地址,我以为......

uint8_t *buffer = NULL; 

必须变成

uint8_t buffer[1]; 
相关问题