我使用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提供的代码几乎完全相同。问题依然存在。