有希
Session#3 본문
이전에는 Queue에서 byte[] 하나만 빼와서 하나씩 전송했는데, SocketAsynEventArgs.BufferList에 보낼 byte[]들을 넣어주면 한 번에 다 보낼 수 있다.
다만, SetBuffer와 BufferList는 하나만 사용해야 한다. RegisterSend()에서 SetBuffer를 사용하는데, 여기서 BufferList도 넣게 되면 에러가 난다. 상황에 맞게 쓰면서 수정해주자.
BufferList에 값을 넣을 때는 List로 만들어서 넣어야 한다. 전역으로 List _pendingList를 생성하고, <T>는 ArragSegment<byte>로 넣어줘야 한다.
RegisterSend에서 첫째줄에서 _pendingList를 클리어해주고 while문으로 Queue에 있는 모든 byte[]들을 꺼내온 뒤, _pendingList에 넣는다.
그리고, args.BufferList에 _pendingList를 대입해주고, SendAsync로 _sendArgs인자넣고 호출.
Send함수에서의 _pending도 _pendingList의 Count를 통해 전송중인지 아닌지 알 수 있다.(이전에 OnSendComplete에서 Queue에 값이 남아있다면 자동으로 계속 보내도록 설정해주었었다.)
다만 주의해야할 점은 Queue를 싹 비워서 다 보내고 있는데, 내가 몇 바이트 보냈는지를 체크해서 상대방이 모두 받을 수 있도록 속도를 조절해야 한다. 또, DDos공격도 있으므로 이를 감지해서 끊어버려야 한다.