Socket Modes, Socket I/O Models 질문 (Blocking, Non-Blocking.)

3권에서 새로 도입된 네트웍 및 멀티플레이어 프로그로그래밍 섹션을 위한 게시판입니다.

Moderator: 류광

Locked
비회원

Socket Modes, Socket I/O Models 질문 (Blocking, Non-Blocking.)

Post by 비회원 »

안녕하세요

Socket 모드와 I/O 시 모델들에 관해 공부중인데 명확히지 않는게 있어 질문올립니다

참고하고 있는 책은 아래 책입니다.

NETWORK PROGRAMMING FOR MICROSOFT WINDOWS (Second Edition)

책에는 분류를 아래 소켓 모드와 I/O 시 모델들로 분류를 해놨습니다

* Socket Modes

- Blocking Mode
- Non-blocking Mode

* Socket I/O Models

- The blocking Model
- The select Model
- The WSAAsyncSelect Model
- The WSAEventSelect Model
- The Overlapped Model
- The Completion Port Model


여기서 궁금한점은 각각 소켓 모드와 I/O 모델을 짝지어주면

Blocking Mode, The blocking Model => 명확히 성립

Blocking Mode, The select Model => 이것도 마찬가지 성립

Non-blocking Mode, The WSAAsyncSelect Model (WSAAsyncSelect 호출시 소켓은 Non-Blocking 모드로 바뀌니 성립)

Non-blocking Mode, The WSAEventSelect Model (WSAEventSelect 호출시 소켓은 Non-Blocking 모드로 바뀌니 성립)

- The Overlapped Model

<질문 1> Overlapped 소켓으로 만들면 기본적으로 이 소켓 타입은 Blocking 모드라고 봐야 하나요 아니면 Non-Blocking 모드라고 봐야하나요 ?

<질문 2> Overlapped 소켓으로 만들고 WSAEventSelect 종류나 ioctlsocket 으로 Non-Blocking 으로 설정하면 Non-Blocking 모드로 볼 수 있는것인지요 ? 아니면 위 질문의 Overlapped 소켓만 만든 상태와 같다고 볼 수 있을까요 ? 그리고 Overlapped 소켓 상태에서 WSAEventSelect 종류를 사용해도 문제 없나요 ? (실제 쓰임새에 상관없이)

<질문 3> 소켓이 Non-Blocking 상태일때 WSASend 를 보내면 WSAEWOULDBLOCK 에러가 리턴될 수 있다고 알고 있습니다. (WSAEventSelect 에서 FD_WRITE 를 받아서 처리) 그런데 Overlapped 소켓 타입일 경우 WSASend 시 WSA_IO_PENDING 이 발생 할텐데 그럼 WSAEWOULDBLOCK 이 발생한다는게 이상합니다. 어찌보면 위 질문에 연관이 있을 수가 있겠네요.

- The Completion Port Model (이건 위 Overlapped Model 과 같은 질문이므로 패스)

<질문 4>
WSARecv 에 OVERLAPPED 구조체를 넘기는 경우 소켓 생성시 WSA_FLAG_OVERLAPPED 을 줄 경우 가능하다고 했는데, WSA_FLAG_OVERLAPPED 주지 않고 생성한 WSARecv 에 OVERLAPPED 구조체를 넘길 경우 어떤식으로 동작을 하나요 ? (해보니 실행은 되더군요)


그럼 좋은 답변 부탁드립니다.

감사합니다.
리안
Posts: 40
Joined: 2005-07-14 14:52
Location: Relic Entertainment
Contact:

Post by 리안 »

<질문 1> Overlapped 소켓으로 만들면 기본적으로 이 소켓 타입은 Blocking 모드라고 봐야 하나요 아니면 Non-Blocking 모드라고 봐야하나요 ?
소켓의 overlapped 속성 여부는 소켓의 blocking/non-blocking 속성과 아무런 상관이 없습니다.
소켓 생성시 디폴트가 blocking이므로 말씀하시는 소켓은 blocking 모드입니다.
<질문 2> Overlapped 소켓으로 만들고 WSAEventSelect 종류나 ioctlsocket 으로 Non-Blocking 으로 설정하면 Non-Blocking 모드로 볼 수 있는것인지요 ?
이는 non-blocking 모드입니다. 다시 말하지만, overlapped 속성과는 상관이 없습니다.
그리고 Overlapped 소켓 상태에서 WSAEventSelect 종류를 사용해도 문제 없나요 ? (실제 쓰임새에 상관없이)
문제 없습니다. overlapped 속성을 주고 소켓을 생성하였다고 overlapped I/O가 저절로 되는 것이 아닙니다. 예를 들어, WSARecv나 WSASend를 사용할 때 overlapped structure에 NULL을 넘기면 이 함수들은 그냥 blocking 모드와 같이 동작합니다. 말씀하신 것과 같이 WSAEventSelect 모델을 사용한다면 소켓이 non-blocking이 될 것이며 overlapped 속성 여부와 관계없이 잘 작동 할 것입니다.
<질문 3> 소켓이 Non-Blocking 상태일때 WSASend 를 보내면 WSAEWOULDBLOCK 에러가 리턴될 수 있다고 알고 있습니다. (WSAEventSelect 에서 FD_WRITE 를 받아서 처리) 그런데 Overlapped 소켓 타입일 경우 WSASend 시 WSA_IO_PENDING 이 발생 할텐데 그럼 WSAEWOULDBLOCK 이 발생한다는게 이상합니다. 어찌보면 위 질문에 연관이 있을 수가 있겠네요.
이것은 MSDN에 잘 나와있습니다. http://msdn.microsoft.com/en-us/library ... 85%29.aspx
WSAEWOULDBLOCK (Windows NT)
Overlapped sockets: there are too many outstanding overlapped I/O requests.
Nonoverlapped sockets: The socket is marked as nonblocking and the receive operation cannot be completed immediately.
<질문 4>
WSARecv 에 OVERLAPPED 구조체를 넘기는 경우 소켓 생성시 WSA_FLAG_OVERLAPPED 을 줄 경우 가능하다고 했는데, WSA_FLAG_OVERLAPPED 주지 않고 생성한 WSARecv 에 OVERLAPPED 구조체를 넘길 경우 어떤식으로 동작을 하나요 ? (해보니 실행은 되더군요)
이것도 MSDN에 잘 나와있습니다.

lpOverlapped [in]
A pointer to a WSAOVERLAPPED structure (ignored for nonoverlapped sockets).

따리서 이 경우 소켓의 동작 방식은 blocking / non-blocking 모드에 따라 달라질 것입니다.


사실 거의 관련된 모든 내용이 이 아티클에 정리되어있습니다.
http://support.microsoft.com/kb/181611

중요 포인트는 개념상 overlapped I/O와 blocking /non-blocking 모드는 서로에 대해 독립적이다 라는 것입니다.
즉, 서로에게 영향을 주지 않습니다. overlapped 속성을 가진 소켓의 디폴트 모드가 blocking 이라고 하여도 overlapped I/O 모델을 사용하면 동시에 여러개의 입/출력이 진행될 것이며, overlapped 속성을 주고 소켓을 만들더라도 overlapped I/O모델을 사용하지 않으면 입/출력은 소켓의 blocking 모드 여부에 따라 작동할 것입니다.

단, Windows NT 4.0에서는 소켓을 non-blocking 모드로 사용하려면 overlapped I/O 모델 사용여부와 상관없이 overlapped 속성 (WSA_FLAG_OVERLAPPED) 을 주고 소켓을 만들어야 합니다. http://support.microsoft.com/kb/179942

그럼 도움이 되었길 ^^
Stay Hungry. Stay Foolish.

http://blog.naver.com/ryanii
비회원

감사합니다

Post by 비회원 »

답변 감사드립니다

보다가 궁금한점이 있는데

INFO: WSA_FLAG_OVERLAPPED Is Needed for Non-Blocking Sockets

http://support.microsoft.com/kb/179942/EN-US/

에 보면 현재 winsock 은 Overlapped Socket 은 Non-Blocking Mode 을 요구한다고 이해하였습니다.

(실제 Overlapped I/O 와 Blocking/Non-Blocking Mode 가 분리되어 있어도 윈도우는 저 조건만 지원한다고)

하지만 Overlapped 소켓을 생성하고 추가적인 Non-Blocking Mode 함수 (WSAAsyncSelect, WSAEventSelect, ioctlsocket) 를 호출하지 않고 Overlapped I/O 가 작동합니다.

이런경우는 어떡게 이해하여야 할까요 ? 저기서 요구한 Non-Blocking Mode 개념이 다른것인가요 ?

즉. Blocking Mode, Overlapped I/O 가 Winsock 에서 지원하지 않는데 왜 가능할까 ?

그리고 Non-Blocking Mode 함수 바로 사용할때 I/O 시 (RECV, SEND) 가 바로 리턴하는 개념과

Overlapped I/O 시 (Non-Blocking Mode 함수 안하고) 바로 리턴하는 개념과 다른가요 ?

잘 이해가 되지 않고 있습니다.

ps.. 덧붙여 리안님 p2p 번역 문서는 잘 보고 있습니다~
비회원

질문에 잘못된점이 있어서...

Post by 비회원 »

INFO: WSA_FLAG_OVERLAPPED Is Needed for Non-Blocking Sockets

위에 언급한 링크가 아니아니라 아래 링크에서 보다가 나온질문이었네요

Socket overlapped I/O versus blocking/nonblocking mode
http://support.microsoft.com/kb/181611/en-us/

Overlapped I/O 속성은 Non-Blocking 소켓모드를 요구한다..

Although the current Winsock implementation requires overlapped I/O attribute for nonblocking socket mode, they are conceptually independent and their programming model is different too.
리안
Posts: 40
Joined: 2005-07-14 14:52
Location: Relic Entertainment
Contact:

Post by 리안 »

그 부분을 반대로 이해하신듯 합니다. :)

문서의 내용은 non-blocking 모드 소켓을 사용하려면 ( for Non-Blocking Sockets), WSA_FLAG_OVERLAPPED 속성이 필요하다 (WSA_FLAG_OVERLAPPED Is Needed) 입니다.

따라서 overlapped I/O 모델은 소켓의 blocking / non-blocking 과 상관없이 작동하는 것입니다. 원래는 non-blocking 소켓이 overlapped 속성을 가지는 것을 요구한다는 것이 말이 안되는 건데, 내부에서 이것을 가정으로 돌아가는 코드가 있나봅니다. 그래서 아티클까지 따로 남긴거 같구요. ^^

그럼 이만~
Stay Hungry. Stay Foolish.

http://blog.naver.com/ryanii
비회원

감사합니다

Post by 비회원 »

네. 제가 거꾸로 이해하고 있었네요.. 어쩐지 이해가 안가더니

이제 이해가 가네요

종합해보면

문서에 있는 내용대로 Window NT 4.0 에서는 넌블럭시 WSA_FLAG_OVERLAPPED 가 요구된다.

WINDOWS 95 에서는 Non-Blocking 시 WSA_FLAG_OVERLAPPED 가 필요없다. 하지만 호환성을 위해

그냥 써라.. 그리고 문서엔 없지만 95 로 봐선 WINDOWS 98, 2000, XP, VISTA, 7 도 필요없다.

여기서 궁금한점이 또 ㅡ.ㅡ;;

Non-Blocking + No Overlapped I/O

vs

Blocking Mode + Overlapped I/O

실제 I/O 연산시 위 두개의 조건은 바로 리턴되는 것으로 알 고 있습니다.

Blocking Mode + Overlapped I/O 시 바로 리턴되는것으로 봐선 Non-Blocking 이라는 개념이

I/O 시 즉시 리턴과는 다른 커널내부나 다른 요소를 지칭하는 것일까요 ?

PS.. 어찌 궁금한점만 늘어가는거 같네요;;
Locked