안녕하세요
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 구조체를 넘길 경우 어떤식으로 동작을 하나요 ? (해보니 실행은 되더군요)
그럼 좋은 답변 부탁드립니다.
감사합니다.
Socket Modes, Socket I/O Models 질문 (Blocking, Non-Blocking.)
Moderator: 류광
-
- Posts: 40
- Joined: 2005-07-14 14:52
- Location: Relic Entertainment
- Contact:
소켓의 overlapped 속성 여부는 소켓의 blocking/non-blocking 속성과 아무런 상관이 없습니다.<질문 1> Overlapped 소켓으로 만들면 기본적으로 이 소켓 타입은 Blocking 모드라고 봐야 하나요 아니면 Non-Blocking 모드라고 봐야하나요 ?
소켓 생성시 디폴트가 blocking이므로 말씀하시는 소켓은 blocking 모드입니다.
이는 non-blocking 모드입니다. 다시 말하지만, overlapped 속성과는 상관이 없습니다.<질문 2> Overlapped 소켓으로 만들고 WSAEventSelect 종류나 ioctlsocket 으로 Non-Blocking 으로 설정하면 Non-Blocking 모드로 볼 수 있는것인지요 ?
문제 없습니다. overlapped 속성을 주고 소켓을 생성하였다고 overlapped I/O가 저절로 되는 것이 아닙니다. 예를 들어, WSARecv나 WSASend를 사용할 때 overlapped structure에 NULL을 넘기면 이 함수들은 그냥 blocking 모드와 같이 동작합니다. 말씀하신 것과 같이 WSAEventSelect 모델을 사용한다면 소켓이 non-blocking이 될 것이며 overlapped 속성 여부와 관계없이 잘 작동 할 것입니다.그리고 Overlapped 소켓 상태에서 WSAEventSelect 종류를 사용해도 문제 없나요 ? (실제 쓰임새에 상관없이)
이것은 MSDN에 잘 나와있습니다. http://msdn.microsoft.com/en-us/library ... 85%29.aspx<질문 3> 소켓이 Non-Blocking 상태일때 WSASend 를 보내면 WSAEWOULDBLOCK 에러가 리턴될 수 있다고 알고 있습니다. (WSAEventSelect 에서 FD_WRITE 를 받아서 처리) 그런데 Overlapped 소켓 타입일 경우 WSASend 시 WSA_IO_PENDING 이 발생 할텐데 그럼 WSAEWOULDBLOCK 이 발생한다는게 이상합니다. 어찌보면 위 질문에 연관이 있을 수가 있겠네요.
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.
이것도 MSDN에 잘 나와있습니다.<질문 4>
WSARecv 에 OVERLAPPED 구조체를 넘기는 경우 소켓 생성시 WSA_FLAG_OVERLAPPED 을 줄 경우 가능하다고 했는데, WSA_FLAG_OVERLAPPED 주지 않고 생성한 WSARecv 에 OVERLAPPED 구조체를 넘길 경우 어떤식으로 동작을 하나요 ? (해보니 실행은 되더군요)
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
그럼 도움이 되었길 ^^
감사합니다
답변 감사드립니다
보다가 궁금한점이 있는데
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 번역 문서는 잘 보고 있습니다~
보다가 궁금한점이 있는데
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 번역 문서는 잘 보고 있습니다~
질문에 잘못된점이 있어서...
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.
위에 언급한 링크가 아니아니라 아래 링크에서 보다가 나온질문이었네요
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:
그 부분을 반대로 이해하신듯 합니다.
문서의 내용은 non-blocking 모드 소켓을 사용하려면 ( for Non-Blocking Sockets), WSA_FLAG_OVERLAPPED 속성이 필요하다 (WSA_FLAG_OVERLAPPED Is Needed) 입니다.
따라서 overlapped I/O 모델은 소켓의 blocking / non-blocking 과 상관없이 작동하는 것입니다. 원래는 non-blocking 소켓이 overlapped 속성을 가지는 것을 요구한다는 것이 말이 안되는 건데, 내부에서 이것을 가정으로 돌아가는 코드가 있나봅니다. 그래서 아티클까지 따로 남긴거 같구요. ^^
그럼 이만~
문서의 내용은 non-blocking 모드 소켓을 사용하려면 ( for Non-Blocking Sockets), WSA_FLAG_OVERLAPPED 속성이 필요하다 (WSA_FLAG_OVERLAPPED Is Needed) 입니다.
따라서 overlapped I/O 모델은 소켓의 blocking / non-blocking 과 상관없이 작동하는 것입니다. 원래는 non-blocking 소켓이 overlapped 속성을 가지는 것을 요구한다는 것이 말이 안되는 건데, 내부에서 이것을 가정으로 돌아가는 코드가 있나봅니다. 그래서 아티클까지 따로 남긴거 같구요. ^^
그럼 이만~
감사합니다
네. 제가 거꾸로 이해하고 있었네요.. 어쩐지 이해가 안가더니
이제 이해가 가네요
종합해보면
문서에 있는 내용대로 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.. 어찌 궁금한점만 늘어가는거 같네요;;
이제 이해가 가네요
종합해보면
문서에 있는 내용대로 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.. 어찌 궁금한점만 늘어가는거 같네요;;