2014-11-11 6 views
0

항상 NetworkStream.Read()에서 수신 대기하는 스레드와 데이터를 교환하는 두 호스트간에 전이중 연결이 있습니다. 어떻게 정상적으로 피 연결을 닫을 수 있습니다 :전이중 Tcp 데이터 교환 C#

1 두 측면 읽기() 함수의 교착 상태

2 - 중단() 스레드를 읽기를 내가 닫는 생각

[안전하게 그들이 닫기] SocketShutdown.Send와의 연결은 어떻게 작동하나요? 그것은 반대편에있는 Read()의 잠금을 해제합니다 .. 문서에는 많은 것들이 없습니다.

Server: create socket 
Server: listen on socket 
Client: create socket 
Client: connect to server's address 
Server: accept connection, which returns a new socket to use for that connection 
Client: receive new socket from result of connect operation 

지금 연결이 설정됩니다 :

+0

IMHO, 학습 소켓을 시작하는 가장 좋은 장소 중 하나가 여기에있다. 나는 최선의 코드 예제가 있음을 인정하지만, 일반적으로 일종의 네트워크 코드를 작성하는 법을 설명하고 설명한다. 오래 전 저는 .NET 프로그래머에게 기본적인 네트워킹 기술을 소개하고자하는 기사를 작성했습니다. http://blogs.msmvps.com/duniho/2008/08/19/basic-network-programming-in-net/ MSDN보다 유용한 예를 찾으십시오. –

답변

3

Thak 간단한 네트워크 교환은 다음과 같이 보입니다. 서로 통신하기 위해 정의 된 프로토콜이 있습니다. 그 프로토콜은 누가 시작하는지 지시 할 것입니다. 그것은 일 수 있지만, 예를 들어, 그것은 클라이언트의 가정 할 수 있습니다

Client: send some data 
Server: receive the data 
Server: send a response 
Client: receive the data 
Client: shutdown with "send" (but still be prepared to receive) 
Server: receive completes with 0 (indicates no more data will be sent by client) 
Server: shutdown with "both" 
Client: receive completes with 0 (indicates no more data will be sent by server) 
Server & Client: close sockets 

를 특정 질문에 응답 :

  1. How is deadlock avoided? 여기에는 교착 가능성이 없습니다. 서버와 클라이언트 모두 비동기 네트워킹 API를 사용하여 작성되는 경우가 많습니다. 그러나 정의 된 프로토콜이 간단한 요청/응답 프로토콜 (예 : HTTP) 인 경우에도 엄격하게 요구되지는 않습니다. 각 엔드는 단일 스레드 일 수 있으며 프로토콜에 따라 송신과 수신을 번갈아 할 수 있습니다.

  2. '어떻게 읽기 스레드를 중단합니까?'그렇지 않습니다. 소켓에서 전체 스레드를 읽기 전용으로 사용하고 있다면 (실제로는별로 좋은 디자인이 아닙니다.) 스레드는 길이가 0 바이트로 완료되는 수신 작업을 볼 때 간단히 종료됩니다. 당신이 환자 인 경우 MSDN 설명서는 또한, 당신이 찾는 정보를 가지고 http://tangentsoft.net/wskfaq/ :

+0

왜 "정말 좋은 디자인이 아니야?" 콜 백 기능을 사용하는 것이 더 낫습니까? –

+0

네, 그 또는 새로운'async/await' 패턴. .NET에서 일반적으로 I/O의 비동기 처리와 소켓에 대한 여러 가지 메커니즘이 지원됩니다. 이러한 API를 올바르게 사용하면 리소스를 효율적으로 사용할 수 있으며 전체 스레드를 단일 작업 전용으로 사용하지 않아도됩니다. –