인프런 커뮤니티 질문&답변

snu님의 프로필 이미지
snu

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

IocpCore

SetUpdateAcceptSocket 질문입니다.

작성

·

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

Rookiss님의 프로필 이미지
Rookiss
지식공유자

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 부분만 건드리기 때문에,
해당 부분만 유효하게 건내주면 됩니다.
 
다른 방식으로는 상속이 아니라 멤버 변수로 두고 그 주소를 넘겨줘도 됩니다.

snu님의 프로필 이미지
snu

작성한 질문수

질문하기