void OnReceiveRequest(IAsyncResult ar)
{
Socket client = null;
bool isListenerAccepting = false;
try {
client = (Socket)ar.AsyncState;
int readBytes = client.EndReceive(ar);
byte [] result = null;
string requestName = ((RequestHandler.RequestCode) Helper.Buffer[0]).ToString();
if (Helper.ShortFromBuffer(1) == _passId) {
Helper.StripGlobalInfoFromBuffer(readBytes);
result = (byte []) typeof(RequestHandler).GetMethod(requestName).Invoke(
null,new object [] {readBytes - 3});
} else if ((RequestHandler.RequestCode) Helper.Buffer[0] == RequestHandler.RequestCode.Test) {
result = new byte [] {0};
}
// we handled the request and have the data, handle other requests now
isListenerAccepting = true;
_listener.BeginAccept(new AsyncCallback(OnIncomingConnection), _listener);
if (result != null && result.Length != 0) {
client.BeginSend(result, 0, result.Length, SocketFlags.None,
OnSentResponse, client);
}
} catch (Exception e) {
if (!_disposed) {
if (e.InnerException == null) {
Log.Error("remote listener request error: ", e.Message ?? "no message");
Log.Error("Stack: ", e.StackTrace);
} else {
Log.Error("remote listener request error: ", e.InnerException.Message ?? "no message");
Log.Error("Stack: ", e.InnerException.StackTrace);
}
if (!isListenerAccepting) {
try {
// error occurred on request handle listening was not started
_listener.BeginAccept(new AsyncCallback(OnIncomingConnection), _listener);
} catch (Exception e2) {
Log.Error("error while starting accepting of remote listener", e2.Message);
}
}
}
}
}