|
간만에 볼랜드포럼에 글 올리네요. ^^
요즘 너무 정신 없어서리..
제가 만들어 놓은 소켓 컴포넌트에 IOCP 지원 기능을 넣으려고 합니다.
원래 컴포넌트는 윈속 1.1에서 동작 가능하게 되어 있었지만 timeout처리가
윈속 1.1에서는 제대로 되지 않아서 좀 고민스럽네요..
(팁.. 비동기 소켓에서 setsockopt함수로 SNDTIMEO나 RCVTIMEO을 지정할 경우
많은 분들이 타임아웃 처리가 된다고 믿으시지만 문서상으로는 윈도우2000부터
동작한다고 되어 있군요. 즉, 윈속 2.0에서만 정상동작합니다.)
근데, IOCP도 구현하는 방식이 크게 두가지인 것으로 알고 있는데요,
1.1에서는 WSPxxx 관련 API가 없는 관계로 socket이나 accept로 얻은 소켓
을 ReadFileEx, WriteFileEx 등을 이용하여 Overlabed 처리해서 구현하고..
2.0에서는 아예 WSPSocket등의 API를 지원하잖아요?
물론 서버구현에 IOCP를 많이 사용하기 때문에 NT서버가 아닌 이상 2.0의
기능을 써도 지장 없을 것 같긴 하지만..
지금 만들어 놓은 컴포넌트가 가벼우면서도 서버/클라이언트 모두에 대해
동기/비동기를 지원하거든요.. OOB데이터도 무난히 처리할 수 있을만큼 유연
성도 좋고.. 기왕 만드는거 소켓 버전에 상관없이 되게 하고 싶은데..
그건 일단 좀 나중 문제고
처음 IOCP소켓을 구현할 때는 1.1기준으로 하는 것이 좋을까요?
아니면 처음부터 2.0기준으로 하고 추후에 1.1지원 기능을 넣어주는게 좋을
까요? 여러분들의 많은 의견 부탁드립니다.
PS. 몇가지 궁금한 것이 있어서 추가로 질문할께요
1. 비동기 소켓(윈속2.0기준)에서는 SNDTIMEO와 RCVTIMEO을 0으로 지정하잖아요?
근데 0을 지정하지 않고 3000, 4000 이런 식으로 값을 지정해도 정상동작에는 지
장을 주지 않는건지 좀 궁금하네요
(정리하자면, 비동기소켓에서 SNDTIMEO나 RCVTIMEO은 무시되는건지, 아니면 반드
시 0으로 설정해야 하는건지... 시험삼아 아무 값이나 넣어봐도 큰 문제는 없어
보이는데..)
2. 현재의 소켓이 동기식으로 동작하는지 비동기식으로 동작하는지를 알고싶다면
if (ioctlsocket(sock, FIONBIO, &nArg)==SOCKET_ERROR && WSAGetLastError() == WSAEINVAL)
return stNonBlocking;
else
return stBlocking;
이런 방식밖에 없는건지.. 그동안에는 소켓클래스에 Blocking인지 Nonblocking인지
멤버로 기록해 놨었는데 그 사이즈도 아까워서 ^^
찾아보니 getsockopt로는 알아낼 수 없더군요.
3. ..... 까무거따..
생각나면 추가로 또 올리죠
다들 즐거운 여름 보내세요
|