static void SendResponse(ResponseParameter a_param) { Thread t = new Thread((object a_param2) => { ResponseParameter param = (ResponseParameter)a_param2; bool r = true; param.m_msg.m_senderType = param.m_senderType; string portname = GetName(param.m_sock); string ctxstr = Message.ContextString(param.m_msg); Config.OnEventDelegate(portname + param.m_responseType + " to " + param.m_dest.ToString() + ctxstr); SocketPoller poller = param.m_worker.m_poller; switch (param.m_sock.ProtocolType) { case ProtocolType.Tcp: if (poller.IsRegstered(param.m_sock) == false) { r = poller.ConnectAndSend(param.m_sock, param.m_dest, param.m_msg); } else { r = poller.Send(param.m_sock, param.m_msg, true); } break; case ProtocolType.Udp: r = poller.SendTo(param.m_sock, param.m_dest, param.m_msg, false); break; default: Debug.Assert(false); break; } if (r == false) Config.OnEventDelegate(portname + "Faild " + param.m_responseType + ctxstr); }); t.IsBackground = true; t.Start(a_param); }
void SecondWorkerRoutine(object a_worker) { Worker worker = (Worker)a_worker; ProtocolType protocol = worker.m_socket.ProtocolType; if (protocol == ProtocolType.Tcp) { worker.m_poller.Start_Acceptor(worker.m_socket); } else { Debug.Assert(protocol == ProtocolType.Udp); worker.m_poller.Start(worker.m_socket); } while (m_run) { Message msg; Socket sock; IPEndPoint sender; bool isTimeout = ! worker.m_poller.WaitForMessage(Config.Server_Poll_Timeout_Ms, out msg, out sock, out sender); if (isTimeout) continue; ++msg.m_contextSeq; msg.m_senderType = Message.SenderType.MainServer_SecondPort; msg.m_address = sender.Address.ToString(); msg.m_port = sender.Port; Socket resSock = null; switch (protocol) { case ProtocolType.Tcp: resSock = Function.CreateSocket(ProtocolType.Tcp, null, false); break; case ProtocolType.Udp: resSock = m_secondUdp.m_socket; break; default: Debug.Assert(false); break; } ResponseParameter param = new ResponseParameter(resSock, worker, sender, new Message(msg), Message.SenderType.Client_SecondPort, "Response"); SendResponse(param); } }
// Called by SendResponse activity. public void SetResponseParameter(string operationName, Type type, object value) { previousResponseParameters[operationName] = new ResponseParameter(type, value); }
void FirstWorkerRoutine(object a_worker) { Worker worker = (Worker)a_worker; ProtocolType protocol = worker.m_socket.ProtocolType; if (protocol == ProtocolType.Tcp) { worker.m_poller.Start_Acceptor(worker.m_socket); } else { Debug.Assert(protocol == ProtocolType.Udp); worker.m_poller.Start(worker.m_socket); } while (m_run) { Message msg; IPEndPoint sender; Socket sock; bool isTimeout = ! worker.m_poller.WaitForMessage(Config.Server_Poll_Timeout_Ms, out msg, out sock, out sender); if (isTimeout) continue; Debug.Assert(protocol == sock.ProtocolType); ++msg.m_contextSeq; msg.m_address = sender.Address.ToString(); msg.m_port = sender.Port; ResponseParameter p1 = null; ResponseParameter p2 = null; ResponseParameter p3 = null; p1 = new ResponseParameter(sock, worker, sender, new Message(msg), Message.SenderType.MainServer_FirstPort, "Response"); switch (protocol) { case ProtocolType.Tcp: p2 = new ResponseParameter(Function.CreateSocket(ProtocolType.Tcp, null, false), worker, sender, new Message(msg), Message.SenderType.MainServer_SecondPort, "Response"); p3 = new ResponseParameter(Function.CreateSocket(ProtocolType.Tcp, null, false), worker, m_subServerAddr_tcp, new Message(msg), Message.SenderType.SubServer, "Pass"); break; case ProtocolType.Udp: p2 = new ResponseParameter(m_secondUdp.m_socket, m_secondUdp, sender, new Message(msg), Message.SenderType.MainServer_SecondPort, "Response"); p3 = new ResponseParameter(m_subServerUdp.m_socket, m_subServerUdp, m_subServerAddr_udp, new Message(msg), Message.SenderType.SubServer, "Pass"); break; default: Debug.Assert(false); break; } string ctxstr = " " + Message.ContextString(msg); Config.OnEventDelegate(GetName(sock) + "Requested from " + sender.ToString() + ctxstr); SendResponse(p1); SendResponse(p2); SendResponse(p3); } }