2013-02-19 2 views
1

호기심에서 ThreadBlocking 유형 인 경우 TServerSocket/TClientSocket의 어떤 이벤트가 시작됩니까?차단 소켓에 어떤 이벤트가 발생합니까?

+0

원격으로는 전문가가 아니지만 동기 소켓에 대해 어떤 이벤트도 발생하지 않을 것으로 예상됩니다. –

+0

@David, 나,하지만 이벤트는 ['OnClientRead'] (http://docwiki.embarcadero.com/Libraries/XE2/en/System.Win.ScktComp.TCustomServerSocket.OnClientRead)와 같은 이벤트가 발생해야합니다. 서버 쪽에서는 클라이언트로부터 아무 것도 읽을 수 없게됩니다. – TLama

+0

@TLama 설명서를 읽지 않는 방식입니다. 읽는 동안 블로킹 소켓은 이러한 이벤트를 사용하지 않고 대신'TWinSocketStream'을 사용합니다. –

답변

4

TClientSocket은 차단 모드이며 OnReadOnWrite을 제외한 모든 이벤트를 발생시킵니다. 또한 OnDisconnect 이벤트는 클라이언트가 소켓의 자체 끝을 닫을 때만 원격 연결 끊기에서 트리거되지 않습니다. 이러한 소켓 상태를 감지하는 것은 데이터 읽기/쓰기 코드의 책임입니다. 가독성은 TWinSocketStream.WaitForRead() 또는 WinSock select() 함수를 통해 감지됩니다. 쓰기 가능 여부는 WinSock select() 기능을 통해서만 탐지됩니다. 원격 분리 먼저 검출 readablity에 의해 감지 된 후 TCustomWinSocket.ReceiveBuf() 또는 TWinSocketStream.Read()는 기본적으로 모든 이벤트 모드 화재 차단에

TServerSocket 0을 반환. 그러나 가상 ClientExecute() 메서드를 재정의하고 OnGetThread 이벤트에서 해당 클래스의 인스턴스를 반환하는 TServerClientThread 클래스를 파생하는 경우 OnReadOnWrite 이벤트가 손실되므로 유사한 논리를 사용하여 차단 모드에서 TClientSocket과 유사한 논리를 검색해야합니다 그 소켓 상태.

+0

마지막 질문, ClientExecute 안에, 나는 오직 읽기/쓰기 만 처리한다. –

+0

'ClientExecute()'를 오버라이드하면 연결을 관리해야한다. 'Terminated'가 참이거나 소켓이 연결이 끊어지면 ('ClientSocket.Connected'가 거짓인지 아닌지를 검사합니다. 그러나 다른 방법으로 연결을 감지 할 수 있습니다), 당신은'ClientExecute()'를 종료해야합니다. 'ClientExecute()'의 내부에서하는 일은 당신 자신의 사업입니다. –

+0

나는 당신의 질문에 대답했다고 생각했다. 만약 당신이'ClientExecute()'를 오버라이드한다면 당신은 읽기와 쓰기를 포함하는 그 연결과 관련된 모든 것을 책임질 것이다. –

관련 문제