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 로 바꾸니 잘되는 이유가 무엇인지 좀 찾아봐야겠다.
'프로그래밍 > C#' 카테고리의 다른 글
C# GZIP 압축이 Unity에서 안될때.. (0) | 2014.08.01 |
---|---|
[C#]MDI부모폼에서 자식폼의 함수 호출 (0) | 2012.10.08 |
[C#]byte[] 데이터 암호화 (0) | 2012.08.31 |
BinaryWriter pointer 사용(seek) (0) | 2012.08.06 |
[ASP.NET C#]이미지 메타태그 값 수정하기 / keyword, comment / EXIF (0) | 2011.12.08 |