2011-04-21 2 views
2

C#에서 소켓 프로그래밍을 할 때 차단이라는 용어의 의미는 무엇입니까?소켓 용어 - "차단"의 의미는 무엇입니까?

데이터를 수신하고 처리하고 발신자에게 데이터를 반환하는 서버 구성 요소 (Windows 서비스 일 수도 있음)를 구축해야합니다. 발신자가 회신을 기다릴 수는 있지만 여러 고객이 동시에 전화 할 수 있도록해야합니다.

클라이언트 1이 연결되어 있고 요청을 처리하는 데 10 초가 걸리는 경우 2 초 후에 클라이언트 2가 전화를 걸면 소켓이 차단됩니까? 아니면 서비스가 다른 스레드에서 두 번째 요청을 처리하기 시작합니까?

요약하면 클라이언트는 응답을 기다릴 수 있지만 동시에 여러 요청을 처리 할 수 ​​있어야합니다.

+0

정말 원시 소켓을 사용해야한다면 인터넷에있는 멀티 스레드 서버에 대한 수십 가지 예가 있습니다. 단지 구글을 가지고 있습니다. 원시 소켓을 사용할 필요가 없다면 WCF를 살펴보십시오. – hyp

답변

4

블로킹은 기본 소켓 작업이 완료 될 때까지 사용자가 (보내기/받기) 호출이 반환하지 않는 ('블록') 것을 의미합니다.

읽기의 의미는 일부 데이터가 수신되거나 소켓이 닫힐 때까지를 의미합니다. 쓰기의 경우 버퍼의 모든 데이터가 전송되었음을 의미합니다.

여러 클라이언트를 처리하려면 각 클라이언트에 대해 새 스레드를 시작하거나 스레드 풀의 스레드에 작업을 전달하십시오.

연결된 TCP 소켓을 공유 할 수 없으므로 클라이언트 당 하나의 소켓이어야합니다.

0

이것은 현재 실행중인 스레드에서 소켓을 사용할 수 없음을 의미합니다.

szerver 측과는 아무런 관련이 없습니다. 소켓에서 응답을 기다리는 동안 스레드가 일시 중지되었음을 의미합니다.

일시 중지하지 않으려면 비동기 방법을 사용하십시오.

더 읽기 : 당신은 스레드 당 하나 개의 소켓을 사용한다 http://www.developerfusion.com/article/28/introduction-to-tcpip/8/

-1

. 블로킹 소켓 (동기식)은 반환하기 전에 응답을 기다립니다. 비 차단 (비동기식)은 수신 된 데이터가 있는지 살펴보고 아직 데이터가없는 경우 반환합니다.

+0

-1 : 첫 번째 문장은 완전히 잘못되었습니다 (일반적인 조언은 스레드를 소켓에 묶는 것을 피하기 위해 비동기 작업을 사용하지 않는 것입니다). 대답의 나머지 부분은 정확하고 모호합니다. ("응답"은 API 반환과 소켓의 다른 쪽 끝의 데이터라는 두 가지 의미가 있습니다.) – Richard

+1

초보자는 OP가 분명히 비동기식 작업으로 시작하는 것을 권장하지 않습니다. 스레드 당 하나의 소켓을 사용해야합니다. 초보자를위한 완벽한 조언입니다. 그러나 비동기 작업은 "엿보기"않습니다. OS가 소켓에 무엇인가가 도착할 때까지는 단순히 "잠"뿐입니다. – jgauffin

0

차단 호출은 호출이 완료 될 때까지 현재 실행중인 스레드를 유지합니다.

예를 들어

, 당신이 읽은

byte[] buf = new byte[10]; 
int bytesRead = stream.Read(buf, 0, buf.Length); 
현재 실행중인 스레드가 읽기 호출에 차단

10까지 바이트를 다음과 같이 전화 네트워크 스트림에서 읽기 방법을 10 바이트를 읽어하고자하는 경우 (또는 ReadTimeout이 만료되었습니다.

현재 스레드를 차단하지 못하도록 읽기 및 쓰기의 비동기 변형이 있습니다. 이들은 .NET의 표준 APM 패턴을 따릅니다. Async 변종은 각 클라이언트에 대한 (차단 될) 스레드를 처리하지 않아도되므로 확장 성이 향상됩니다.

차단 작업은 일반적으로 데이터를 보내거나받는 작업과 연결을 설정하는 작업 (예 : 새 클라이언트를 수신하거나 다른 수신기에 연결)입니다.

0

질문에 답하기 위해 기본적으로 블로킹은 반환 할 때까지 컨트롤이 함수 또는 코드 블록 (예 : C++의 readfile() 등)에 머물러 있다는 것을 의미하며이 코드 블록 다음의 코드로 이동하지 않습니다. 단일 스레드 또는 다중 스레드 컨텍스트 일 ​​수 있습니다. 단일 스레드 코드에서 호출을 차단하는 것은 기본적으로 재앙을위한 처방입니다.

솔루션 :

는 C#으로이 문제를 해결하려면 단순히 통화를 차단하지 않습니다 예를 BeginInvoke() 및 소켓 컨텍스트에서 EndInvoke() 비동기 방법을 사용할 수 있습니다. 이를 비동기 프로그래밍 방식이라고합니다. BeginInvoke() 및 EndInvoke()는이를 수행하기 위해 따라야 할 ASYNCHRONOUS 메서드에 따라 대리자 나 컨트롤에서 호출 할 수 있습니다.

0

당신은 가독성이나 쓸수 모두 여러 개의 소켓을 확인하는 기능 Socket.Select()

Select(IList checkRead, IList checkWrite, IList checkError, int microSeconds) 

를 사용할 수 있습니다. 장점은 간단하다는 것입니다. 단일 스레드에서 수행 할 수 있으며 대기 시간 (영원 (-1 마이크로 초) 또는 특정 지속 기간)을 지정할 수 있습니다. 그리고 소켓을 비동기로 만들 필요가 없습니다 (즉, 블로킹을 유지하십시오).

청취 소켓에서도 작동합니다. 쓰기 가능성을보고합니다. 수락 할 연결이있을 때. 실험을 통해, 정상적인 연결 해제에 대한 가독성을보고한다고 말할 수 있습니다.

아마도 비동기 소켓만큼 빠르지 않을 것입니다. 또한 오류를 탐지하는 데 이상적이지 않습니다. 3 번째 매개 변수에 대해서는 사용하지 않았는데, 그것은 ungraceful disconnect를 감지하지 못하기 때문입니다.

관련 문제