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.

Когда происходит любое из этих двух событий, метод делегата отвечает за обнаружение состояния конца файла и его очистку.

Другие вопросы по тегам