반응형

_pendingList.Count == 0 이면 보내기를 시작한다는 얘기는 현재 send 를 할때 보낼 데이터중 큐에 있는 것을 모두 뽑아와 한번에 보내는 한번의 send 처리가 이뤄지는 단계라는 것이다

이것으 ArraySegment 를 통해 버퍼의 범위를 지정하여 리스트 혀앹로 담아서

_sendArgs.BufferList = 에 할당해 주면 되고 보낼때는 이 전과 동일하게 SendAsync 를 호출해주면 한번에 보내지게 된다

 

그래서 sendAsync 를 할때 여러 리스트로 구성된 데이터를 한번에 보내게 되고 보내는 처리가 완료되면

OnSendCompleted 가 callback 으로 호출 되게 된다

 

이때 callback 은 별도의 소켓 스레드에 의해서 호출 된 것임으로 sendAsync 를 호출한 후와 OnSendCompleted  이 함수가 호출되기 전 이 사이에서 다른 소켓에 의해 _sendQueue 에 데이터가 채워질수 있기 때문에

 

OnSendCompleted  에서는 _sendQueue 에 데이터가 채워진게 있다면 다시 send 하는 처리 => 여기선 RegisterSend() 를 호출하여 send 하는 처리를 다시 반복시켜준다 : 데이터를 보내야 할 것이 있었던것이기 때문에 보내줘야 함

 

 

 

 

 

 

고려해 봐야 할 점

  • 생각해 봐야 할것은 만약 유저가 엄청 많이 몰려있어서 많은 데이터를 다른 유저간에 서로 보내줘야 할때
    이렇게 요청이 올때마다 보내는 것 보단 일정 패킷을 모아서 다른 유저들에게 한번에 보내주는 것이 더 효과 적일 수도 있다
  • 또는 어떤 유저가 악의적으로 요청(데이터)을 계속 보내서 DDOs 서버에서 이것을 감당하기 힘든 상태가 되는 경우가 발생할 수 있음으로 비정상적으로 많은 데이터를 어떤 클라에서 보내고 있다면 해당 연결을 Disconnect 처리해서 이것을 막아야한다

 

 

 

 

 

반응형

'서버(Server) > Server' 카테고리의 다른 글

PacketSession  (0) 2022.12.29
TCP, UDP 차이  (0) 2022.12.27
멀티스레드를 고려한 SendAsync 보내기  (0) 2022.12.24
_socket.ReceiveAsync 비동기 처리  (0) 2022.12.23
비동기 accept 처리 : _listenSocket.AcceptAsync  (0) 2022.12.23

+ Recent posts