Created
July 30, 2017 13:34
-
-
Save anonymous/147d4fb8fc541f0c352db8ff819a1e71 to your computer and use it in GitHub Desktop.
Send and Receive using SocketAsyncEventArgs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private void StartSend(SocketAsyncEventArgs sendReceiveEventArgs) | |
{ | |
byte[] msgToSend = (byte[])sendReceiveEventArgs.UserToken; | |
// If the number of bytes to send is larger than the buffer we need more than one operation | |
if (msgToSend.Length <= SocketSettings.BufferSizeEach) | |
{ | |
sendReceiveEventArgs.SetBuffer(msgToSend, 0, msgToSend.Length); | |
} | |
else | |
{ | |
// Handle exception here for larger than buffer size instead of throwing an exception! | |
throw new Exception("Handle case for larger than buffer size here!"); | |
} | |
bool willRaiseEvent = sendReceiveEventArgs.AcceptSocket.SendAsync(sendReceiveEventArgs); | |
// This will automatically call the IO_Completed process (ProcessSend) after completion. | |
} | |
private void ProcessSend(SocketAsyncEventArgs sendReceiveEventArgs) | |
{ | |
if (sendReceiveEventArgs.SocketError == SocketError.Success) | |
{ | |
StartReceive(sendReceiveEventArgs); | |
} | |
else | |
{ | |
CloseClientSocket(sendReceiveEventArgs); | |
} | |
} | |
private void StartReceive(SocketAsyncEventArgs sendReceiveEventArgs) | |
{ | |
bool willRaiseEvent = sendReceiveEventArgs.AcceptSocket.ReceiveAsync(sendReceiveEventArgs); | |
} | |
private void ProcessReceive(SocketAsyncEventArgs sendReceiveEventArgs) | |
{ | |
if (sendReceiveEventArgs.SocketError != SocketError.Success) | |
{ | |
CloseClientSocket(sendReceiveEventArgs); | |
} | |
else | |
{ | |
if (sendReceiveEventArgs.BytesTransferred == 0) | |
{ | |
CloseClientSocket(sendReceiveEventArgs); | |
} | |
else | |
{ | |
byte[] msg = sendReceiveEventArgs.Buffer; | |
byte[] response = MessageManager.ProcessReceivedMessage(msg); | |
if (response != null) | |
{ | |
sendReceiveEventArgs.UserToken = response; | |
StartSend(sendReceiveEventArgs); | |
} | |
StartReceive(sendReceiveEventArgs); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment