달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'BeginReceive 딜레이'에 해당되는 글 1건

  1. 2014.02.26 [C#] Socket.BeginReceive 딜레이 현상.

internal static ManualResetEvent recvDone = new ManualResetEvent(false);

....

public void Receive(Session session)
        {

session.Socket.BeginReceive(session.RecvMsg.stream, session.RecvMsg.ReadSize, (session.RecvMsg.stream.Length - session.RecvMsg.ReadSize), SocketFlags.None, new AsyncCallback(ReceiveCallback), session);

recvDone.WaitOne();

}

private void ReceiveCallback(IAsyncResult ar)
        {

recvDone.Set();

....
                this.Receive(session);

}

 

이와 같은 코드로 비동기 소켓 서버를 구현하였다.

 

그런데...

동시에 여러개의 패킷이 마구 날아오는 경우 최초 3~4개는 바로 바로 받는데 이후부터는 0.5초당 1개씩 패킷이 처리된다..

고민을 하다가  ManualResetEvent 를 사용안하고  IAsyncResult 의 WaitOne을 써보기로 했다.

 

Receive 함수의 비동기 리시브를

IAsyncResult ar = session.Socket.BeginReceive(session.RecvMsg.stream, session.RecvMsg.ReadSize, (session.RecvMsg.stream.Length - session.RecvMsg.ReadSize), SocketFlags.None, new AsyncCallback(ReceiveCallback), session);
                ar.AsyncWaitHandle.WaitOne();

이렇게 바꾸니.. 바로 바로 리시브 처리가 된다 ..

 

아우... msdn예제에서는 ResetEvent를 사용하던데.. IAsyncResult 로 바꾸니 잘되는 이유가 무엇인지 좀 찾아봐야겠다.

Posted by SadDev
|