【发布时间】: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