2014-06-08 4 views
3

NSStream을 사용하여 연결하는 클라이언트 - 서버 앱이 있습니다. 때로는 연결을 열려고 할 때 처음에는 메시지를 보낼 때 연결의 한 쪽에서 NSStreamEventEndEncountered를 얻습니다.NSStream에서 NSStreamEventEndEncountered를받습니다.

저는 CFStream과 NSStream 사이에서 브리지를 사용합니다. 내 서버와 소켓을 만들기 : handleConnect 콜백 함수에서

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

, CFStreamCreatePairWithSocket 두 CFStream를 가져 오는 데 사용됩니다.

내 클라이언트는 CFStreamCreatePairWithSocketToHost을 사용하여 호스트에 연결합니다.

클라이언트가 연결 (NSStream 생성) 한 다음 ping을 보냅니다. 내 서버가 연결을 받으면 NSStream을 열고 ping을 받으면 pong을 보냅니다.

연결 중 하나가 닫히면 스트림에서 kCFStreamPropertyShouldCloseNativeSocket을 true로 설정 했으므로 다른 하나가 NSStreanEventEndEncountered를 가져와야합니다.

몇 가지 다른 결과가 있습니다. NSLog를 사용하여 어떤 일이 발생했는지 확인했습니다.

- 연결이 예상대로 작동하는 대부분의 시간.

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

- 퐁을 보내려고 할 때 연결이 닫힙니다 (NSStreamEventEndEncountered). 핑을 보내려고 할 때 클라이언트는 탁구를받을 만

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

년 - 연결 닫히고 NSStreamEventEndEncountered

(NSStreamEventEndEncountered)를받을 수 없습니다.

Server did recieve new connection; 
Error recieved: The operation couldn’t be completed. Connection reset by peer 

클라이언트와 서버는 내 컴퓨터에있는 : 핑을 보내려고 할 때 서버는

Server did recieve new connection 
Client closed 

-an 오류가 받았다 된 핑을받을 또는 NSStreamEventEndEncountered하지 않습니다. 쓰려고하면 스트림이 NSStreamEventEndEncountered를 얻는 이유는 무엇입니까?

답변

5

문제점을 발견했습니다. 연결이 열리 자마자 전송 된 버퍼가 있습니다. 이 버퍼에 데이터가없는 경우, 스트림의 종료 신호 인 빈 버퍼가 전송됩니다.

귀하의 연결 대리인의 스트림 : :의 handleEvent : 방법이 NSStreamEventHasBytesAvailable로 설정 streamEvent 불려 Apple Doc:

에서

연결의 다른 쪽 끝은 연결을 종료합니다. 해당 스트림 에서 읽을 때 길이는 0입니다.

연결 대리인의 stream : handleEvent : 메서드가 호출되어 streamEvent가 NSStreamEventEndEncountered로 설정됩니다.

이 두 이벤트 중 하나가 발생하면 대리인 메서드는 파일 끝 조건을 감지하고 정리하는 작업을 담당합니다.