У меня есть клиент-серверное приложение, которое использует 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 при попытке записи?