gpt4 book ai didi

objective-c - NSStream - 操作无法完成。连接被拒绝

转载 作者:行者123 更新时间:2023-12-03 16:47:02 25 4
gpt4 key购买 nike

我正在尝试将 2 个设备与 NSNetService 连接 - 设备 A 发布服务,设备 B 可以浏览该服务并建立连接。昨天我注意到一个非常讨厌的问题。

我第一次在设备 A 上启动服务并尝试打开输入/输出流,一切都按预期进行。如果我随后退出设备 A 上的应用程序并重新打开它,则会创建该服务(因为 netServiceDidPublish 被调用),但是当我尝试再次打开流时,我收到以下错误域 = NSPOSIXErrorDomain Code=61“操作无法完成。连接被拒绝。然后我可以稍等一下,然后尝试再次打开应用程序,流将按预期再次打开。

我认为这与我退出应用程序时没有关闭流有关。这就是为什么我尝试关闭 -(void)applicationWillTerminate 中的流。负责关闭的方法被调用,但下次启动应用程序时,我收到相同的错误消息。

我用Apple提供的CocoaEcho示例代码进行了涂鸦,但没有发现任何重大差异。或者我可能是错的。

值得一提的是,我为服务发布创建了一个单例类。我认为这不重要,但人们永远无法知道。您可以在下面找到我用于服务发布、流打开和流关闭的一些代码。

开放服务:

-(void)startServiceWithName:(NSString*)name withType:(NSString*)type {

// init the socket
if(_socket) {

// socket initialized
addr = (struct sockaddr*)[[_socket address] bytes];

if (addr->sa_family==AF_INET) {
// IPV4
port = ntohs( ((struct sockaddr_in *)addr)->sin_port );
}

if (addr->sa_family==AF_INET6) {
// IPV6
port = ntohs( ((struct sockaddr_in6 *)addr)->sin6_port );
}


} else {

// socket nil
_socket = nil;
NSLog(@"Socket init failed. Can't handle");

}

// init the service
if(_socket) {

// we have a socket
_service = [[NSNetService alloc] initWithDomain:@"local."
type:type
name:name
port:port];

if (_service) {

[_service setDelegate:self];
[_service publish];

}

}

}

服务已发布:

-(void)netServiceDidPublish:(NSNetService *)sender {

NSLog(@"Service published on port %li", [sender port]);

if(![self openStreams]) {
NSLog(@"Could not open streams");
}

}

打开流

-(BOOL)openStreams {

NSInputStream *is;
NSOutputStream *os;

if ([_service getInputStream:&is outputStream:&os]) {

_inputStream = is;
_outputStream = os;

[_inputStream setDelegate:self];
[_outputStream setDelegate:self];
[_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_inputStream open];
[_outputStream open];

return YES;
}

return NO;
}

关闭流

-(void)closeStreams {
[_inputStream setDelegate:nil];
[_outputStream setDelegate:nil];
[_inputStream close];
[_outputStream close];

[_inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

_inputStream = nil;
_outputStream = nil;

}

希望这已经足够了。提前致谢

最佳答案

每次启动应用程序时,是否都会调用 -(void)startServiceWithName:(NSString*)name withType:(NSString*)type

我建议每次调用 -(void)startServiceWithName:(NSString*)name withType:(NSString*)type 之前关闭流。

例如:

    [self.inStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[inStream release];
inStream = nil;

[self.outStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[outStream release];
outStream = nil;

[self startServiceWithName:someName withType:someType];

关于objective-c - NSStream - 操作无法完成。连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12854283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com