작성
·
354
0
1. 일반 accept 함수가 리턴하면 client 소켓과 통신할 소켓이 리턴되는데 listen 소켓 속성과 같은 속성이 리턴된다고 알고있습니다. 하지만 AcceptEX 함수에서는 client와 통신할 소켓을 미리 만들어 인자로 전달하기 떄문에 수동으로 SetUpdateAcceptSocket 를 호출하는 것인가요?
2.getpeername 함수에서 두번째 인자로
reinterpret_cast<SOCKADDR*> 캐스팅을 해주는 이유가 궁금합니다.
static_cast나 (SOCKADDR*) 과 같은 캐스팅보다 위와 같이 하는 이유가 궁금합니다.
3. AcceptEx 함수에 IocpEvent 형 acceptEvent를 Overlapped 타입으로 캐스팅하여 전달하는데
OVERLAPPED 구조체를 상속하여 크기가 큰 클래스(IocpEvent)를 전달하여도 OVERLAPPED 타입에 맞게 데이터가 잘리지 않고
GetQueuedCompletionStatus에서 복원는데 이게 맞는건가요?
포인터로 주소만 전달하기 때문에 가능한 것인지 int -> char 타입으로 캐스팅 할때처럼 데이터가 잘리지 않는건지 궁금합니다
답변 1
1
1. API 관련 질문은, 항상 MSDN을 찾아보셔야 합니다.
When the AcceptEx function returns, the socket sAcceptSocket is in the default state for a connected socket. The socket sAcceptSocket does not inherit the properties of the socket associated with sListenSocket parameter until SO_UPDATE_ACCEPT_CONTEXT is set on the socket. Use the setsockopt function to set the SO_UPDATE_ACCEPT_CONTEXT option, specifying sAcceptSocket as the socket handle and sListenSocket as the option value.
https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-acceptex
2. (SOCKADDR*) C 스타일 캐스팅은 가장 강력하지만 다소 위험한 형태라서, C++에선 4종 캐스팅 중 하나를 사용을 권장합니다. 각종 캐스팅 차이는 여기서 설명하기엔 너무 길기 때문에 리서치를 해보시기 바랍니다.
3. 네 정확히 OVERLAPPED 부분만 건드리기 때문에,
해당 부분만 유효하게 건내주면 됩니다.
다른 방식으로는 상속이 아니라 멤버 변수로 두고 그 주소를 넘겨줘도 됩니다.