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

cckiz153님의 프로필 이미지
cckiz153

작성한 질문수

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

PacketSession

ProcessSend에 대해서 질문이 있습니다.

작성

·

253

0

WRITE_LOCK; if (_sendQueue.empty()) _sendRegistered.store(false); else RegisterSend();
 
ProcessSend에서 WRITE_LOCK의 의미가 잘 이해가 되지 않습니다.
 
이미 큐에 대한 작업을 할 때 WRITE_LOCK을 일일이 잡아주고 있는데 ProcessSend에서 굳이 다시 락을 잡는 이유가 무엇인가요? 그리고 
 
Lock(); if (_sendQueue.empty()) _sendRegistered.store(false);
Unlock();
else
Unlock();
RegisterSend();
 
와 같이 락의 범위를 잡으니 패킷 유실이 발생하는데 이렇게 잡으면 안되는 이유를 전혀 모르겠습니다..

 

 

답변 2

0

cckiz153님의 프로필 이미지
cckiz153
질문자

강사님 혹시 이런 것까지 여쭤봐도 될지 모르겠지만 혹시 wsasend에서 실패 후 wsagetlasterror 에러코드 10022 (WSAEINVAL )를 경험해보신 적이 있으신가요..? 에코서버를 돌리면서 어느 정도 시간이 지나면 세션 2개 정도가 위 에러가 뜨는데 혹시 경험해보신 적이 있으면 어떤 이유인지 여쭤볼 수 있을까요?

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

네트워크 프로그래밍을 할 때 에러는 하도 상황별로 많아서 
그냥 검색해보시면서 해야 합니다.

0

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

RegisterSend를 한다고 바로 ProcessSend가 호출되는건 아니고,
네트워크 전송이 완료되면 다른 쓰레드를 통해 ProcessSend가 호출될 수도 있기 때문입니다.

cckiz153님의 프로필 이미지
cckiz153

작성한 질문수

질문하기