void OnReceive(IAsyncResult ar)
{
Request r = (ar.AsyncState as Request);
Socket socket = r.Socket;
try
{
r.Length += socket.EndReceive(ar);
// compare incoming data with expected request
for (int i = 0; i < r.Length; i++)
{
if (r.Buffer[i] != request[i])
{
// invalid request, close socket
socket.Close();
return;
}
}
if (r.Length == request.Length)
{
// request complete, send policy
socket.BeginSend(policy, 0, policy.Length, SocketFlags.None, new AsyncCallback(OnSend), socket);
}
else
{
// continue reading from socket
socket.BeginReceive(r.Buffer, r.Length, request.Length - r.Length, SocketFlags.None,
new AsyncCallback(OnReceive), ar.AsyncState);
}
}
catch
{
// if anything goes wrong we stop our connection by closing the socket
socket.Close();
}
}