NSStream получает NSStreamEventEndEncountered во время открытия
У меня есть клиент-серверное приложение, которое использует NSStream для подключения. иногда при попытке открыть соединение одна сторона соединения получает NSStreamEventEndEncountered при первой попытке отправить сообщение.
Я использую мост между CFStream и NSStream. Мой сервер создает сокет с:
_ipv4cfsock = CFSocketCreate(kCFAllocatorDefault,PF_INET, SOCK_STREAM,IPPROTO_TCP, kCFSocketAcceptCallBack, handleConnect, &info);
В функции обратного вызова handleConnect, CFStreamCreatePairWithSocket
используется для получения двух CFStream.
Мой клиент использует CFStreamCreatePairWithSocketToHost
подключиться к хосту.
Клиент подключается (создает NSStreams) и затем отправляет пинг. Когда мой сервер получает соединение, он открывает NSStream, а когда он получает пинг, он отправляет понг.
Когда одно из соединений закрывается, другое должно получить NSStreanEventEndEncountered, как я установил kCFStreamPropertyShouldCloseNativeSocket
правда на потоках.
Я получаю несколько разных результатов: я использовал NSLog, чтобы увидеть, что происходит.
Большую часть времени соединение открывается и работает как положено.
Server did recieve new connection
Server recieved ping
Server Sent pong
Client recieved pong
-Подключение закрывается (NSStreamEventEndEncountered) при попытке отправить понг. Клиент не получает понг, но получает NSStreamEventEndEncountered
Server did recieve new connection
Server recieved ping
Server recieved pong
Server closed
Client closed
-Подключение соединения (NSStreamEventEndEncountered) при попытке отправить пинг. Сервер не получает пинг или NSStreamEventEndEncountered
Server did recieve new connection
Client closed
-Ошибка получена при попытке отправить пинг:
Server did recieve new connection;
Error recieved: The operation couldn’t be completed. Connection reset by peer
И клиент, и сервер находятся на моем компьютере. Почему поток получает NSStreamEventEndEncountered при попытке записи?
1 ответ
Я обнаружил проблему, у меня был буфер, который был отправлен, как только мое соединение открылось. Если в этом буфере не было данных, был отправлен пустой буфер, который является сигналом окончания для потоков.
Из Apple Doc:
Если другой конец соединения закрывает соединение:
Ваш делегат соединения stream:handleEvent: метод вызывается с streamEvent, установленным в NSStreamEventHasBytesAvailable. Когда вы читаете из этого потока, вы получаете длину ноль (0).
Ваш делегат соединения stream:handleEvent: метод вызывается с streamEvent, установленным в NSStreamEventEndEncountered.
Когда происходит любое из этих двух событий, метод делегата отвечает за обнаружение состояния конца файла и его очистку.