【问题标题】:The operation couldn’t be completed. Connection reset by peer操作无法完成。对等方重置连接
【发布时间】:2013-09-22 20:15:21
【问题描述】:

我正在使用 iOS 中的套接字编程来开发打印功能。我正在使用以下代码打开流并执行读写操作。在打开流时,委托会为输入和输出流调用打开事件。我还收到一个NSStreamEventHasSpaceAvailable 事件,我在其中执行写操作和NSStreamEventHasBytesAvailable 事件,我在其中执行读操作。前 2 次写操作成功发生,之后我得到字节可用事件,我试图执行读操作。每次我得到 -1 作为字节读取并获得带有消息的NSStreamEventErrorOccurred 事件

“操作无法完成。连接被对端重置”

对于NSInputStream,紧随其后的是NSOutputStream 的相同事件,同时执行第三次写入。有时我什至也会遇到 Broken Pipe 错误。

        CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"123.123.12.12",DEFAULT_LPR_PORT, &readStream, &writeStream);
self.inputStream = (__bridge NSInputStream *)readStream;
self.outputStream = (__bridge NSOutputStream *)writeStream;

[self.inputStream setDelegate:self];
[self.outputStream setDelegate:self];

[self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[self.inputStream open];
[self.outputStream open];

Stream 事件处理程序 - Delagate 方法代码 读取的字节数始终为 -1。

    case NSStreamEventHasBytesAvailable:
    {
        NSLog(@"NSStreamEventHasBytesAvailable");
        if (theStream == inputStream) {
            
            uint8_t buffer[1024];
            int len = 0;
            
            while ([self.inputStream hasBytesAvailable]) {
                len = [self.inputStream read:buffer maxLength:sizeof(buffer)];
                NSLog(@"bytes read len --- :%d ",len);
                if (len > 0) {
                    
                    NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
                    
                    if (nil != output) {
                        NSLog(@"bytes value: %@", output);
                    }
                }
            }
        }
    }
        break;

错误:

    2013-09-18 12:27:36.424 SPConnector[1936:907] stream:handleEvent: : <__NSCFInputStream: 0x1e07b0e0>
    2013-09-18 12:27:36.428 SPConnector[1936:907] NSStreamEventErrorOccurred localizedDescription --- The operation couldn’t be completed. Connection reset by peer
    2013-09-18 12:27:36.430 SPConnector[1936:907] NSStreamEventErrorOccurred domain --- NSPOSIXErrorDomain
    2013-09-18 12:27:36.431 SPConnector[1936:907] NSStreamEventErrorOccurred Code --- :54
    2013-09-18 12:27:36.432 SPConnector[1936:907] stream:handleEvent: : <__NSCFOutputStream: 0x1e07b170>
    2013-09-18 12:27:36.433 SPConnector[1936:907] NSStreamEventErrorOccurred localizedDescription --- The operation couldn’t be completed. Connection reset by peer
    2013-09-18 12:27:36.434 SPConnector[1936:907] NSStreamEventErrorOccurred domain --- NSPOSIXErrorDomain
    2013-09-18 12:27:36.435 SPConnector[1936:907] NSStreamEventErrorOccurred Code --- :54

有人可以告诉我问题的原因吗?

【问题讨论】:

  • 好吧,“对等方重置连接”意味着服务器关闭了连接,您对此无能为力。您一定以某种方式打乱了它,但我认为这超出了您的问题范围。服务器上是否有日志,您可以看到它为什么一怒之下离开?
  • 有时我什至会遇到 Broken Pipe 错误。它要么显示对等或断管错误的连接重置。我实际上是在尝试连接到 MFD 设备。必须检查是否有任何此类选项来验证设备日志。
  • 出现“Broken pipe”错误的原因是什么?
  • 我不知道管道从哪里进入所以不知道。
  • 我也遇到了这个错误的问题。我没有就对等方重置的连接正确找到解决方案。但我可以为你指出一些方向。在 Broken Pipe 上,检查您是否正在将数据快速发送到套接字。在套接字中的每次写入之间设置 10 或 20 毫秒的延迟。

标签: ios objective-c sockets


【解决方案1】:

我收到同样的信息。 我用“getHandShakeParameter”字符串调用我的服务, 但他的名字是“GetHandShakeParameter”,大写的“G”……

问题解决了;)

【讨论】:

  • 你能解释一下你做了什么吗?
  • 在我的例子中,我使用了错误的服务名称,并且我在对象中得到了错误。
  • 通过服务,你是指套接字连接还是其他什么?
猜你喜欢
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多