NSStream получает NSStreamEventEndEncountered во время открытия

У меня есть клиент-серверное приложение, которое использует NSStream для подключения. иногда при попытке открыть соединение одна сторона соединения получает NSStreamEventEndEncountered при первой попытке отправить сообщение.

Я использую мост между CFStream и NSStream. Мой сервер создает сокет с:

_ipv4cfsock = CFSocketCreate(kCFAllocatorDefault,PF_INET, SOCK_STREAM,IPPROTO_TCP, kCFSocketAcceptCallBack, handleConnect, &info);

В функции обратного вызова handleConnect CFStreamCreatePairWithSocketиспользуется для получения двух потоков CFStream.

Мой клиент использует CFStreamCreatePairWithSocketToHost для подключения к хосту.

Клиент подключается (создает NSStreams), а затем отправляет эхо-запрос. Когда мой сервер получает соединение, он открывает NSStream, а когда получает пинг, отправляет понг.

Когда одно из соединений закрывается, другое должно получить NSStreaEventEndEncountered, поскольку я установил для потоков kCFStreamPropertyShouldCloseNativeSocket значение true.

Я получаю несколько разных результатов: я использовал NSLog, чтобы посмотреть, что происходит.

-Большую часть времени соединение открывается и работает как положено.

Server did recieve new connection
Server recieved ping
Server Sent pong
Client recieved pong

-Соединение закрывается (NSStreamEventEndEncountered) при попытке отправить pong. Клиент не получает pong, но получает NSStreamEventEndEncountered

Server did recieve new connection
Server recieved ping
Server recieved pong
Server closed
Client closed

-Соединение закрывается (NSStreamEventEndEncountered) при попытке отправить пинг. Сервер не получает ping или 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 при попытке записи?


person impact27    schedule 08.06.2014    source источник


Ответы (1)


Я нашел проблему, у меня был буфер, который был отправлен, как только мое соединение открылось. Если в этом буфере не было данных, был отправлен пустой буфер, что является сигналом окончания для потоков.

Из Apple Doc:

Если другой конец соединения закрывает соединение:

Метод stream:handleEvent: вашего делегата подключения вызывается с параметром streamEvent, для которого задано значение NSStreamEventHasBytesAvailable. Когда вы читаете из этого потока, вы получаете нулевую длину (0).

Метод stream:handleEvent: вашего делегата соединения вызывается с параметром streamEvent, для которого задано значение NSStreamEventEndEncountered.

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

person impact27    schedule 12.06.2014