ChattingServer

[ChattingServer] SendComplete ( WSASend 통지 완료 처리 )

program-yam 2025. 6. 2. 19:34

IOCP Send 완료 통지 함수인 SendComplete를 구현했다.

WSASend 완료 통지가 오면, 전송 완료된 패킷을 먼저 정리한다.

isSend을 0으로 바꿔 WSASend를 걸 수 있도록 한다.

 

isSend가 0으로 바뀌기 전에 큐잉된 packet들이 있을 수 있으므로 sendQueue의 크기를 재고 0보다 크면 SendPost를 호출한다.

void CoreNetwork::SendComplete(Session* sendCompleteSession)
{
	// 전송 완료된 패킷을 정리한다.
	for (int i = 0; i < sendCompleteSession->sendPacketCount; i++)
	{
		delete sendCompleteSession->sendPacket[i];
		sendCompleteSession->sendPacket[i] = nullptr;
	}

	sendCompleteSession->sendPacketCount = 0;

	// isSend를 0 으로 바꿔서 WSASend를 걸수 있도록 해준다.
	InterlockedExchange(&sendCompleteSession->isSend, 0);

	// 만약 위에서 바꾸기 전에 큐잉만 하고 빠질 경우
	// 여기서 크기를 검사해서 WSASend를 걸어준다.
	if (sendCompleteSession->sendQueue.size() > 0)
	{
		SendPost(sendCompleteSession);
	}
}