public static UdpConnectionContract.Imp : ReadyState GetNewUdpEndPoint() { UdpContract.Imp !udpImp; UdpContract.Exp !udpExp; UdpContract.NewChannel(out udpImp, out udpExp); if (ConnectEndPoint(UdpContract.ModuleName, udpExp)) { udpImp.RecvReady(); UdpConnectionContract.Imp !connImp; UdpConnectionContract.Exp !connExp; UdpConnectionContract.NewChannel(out connImp, out connExp); udpImp.SendCreateUdpSession(connExp); connImp.RecvReady(); delete udpImp; return(connImp); } else { delete udpImp; return(null); } }
protected override void Run(StopThreadContract /*.Exp*/ terminator) { ServiceProviderContract /*.Exp*/ nsExp = spRef.Acquire(); // Here is the set of client channels we service ESet < UdpContract /*.Exp*/ epSet = new ESet < UdpContract/*.Exp*/ (); while (true) { switch receive { // // Don't forget that we're selecting UdpContract endpoints // from the epSet endpoint-set. In each case that we // receive a message from one of those endpoints, we // need to remember to put the endpoint back into epSet // if we want to keep listening to it. // case ep.CreateUdpSession(UdpConnectionContract /*.Exp*/: Start newEP) in epSet: { // Move the endpoint to the ReadyState newEP.SendReady(); // Create a dedicated thread to service this connection UdpConnectionExpThread udpThread = new UdpConnectionExpThread(newEP); udpThread.Start(); ep.SendAck(); epSet.Add(ep); } break; case nsExp.Connect(ServiceContract /*.Exp*/: Start newEp) : { // We expect people top give us // UdpContract/*.Exp*/ instances // UdpContract/*.Exp*/:Start newUdpEp = newEp // as UdpContract/*.Exp*/; UdpContract /*.Exp*/ newUdpEp = newEp as UdpContract /*.Exp*/; if (newUdpEp == null) { // Invalid contract type. Fail. nsExp.SendNackConnect(newEp); } else { // Signal ready and start // servicing this contract nsExp.SendAckConnect(); newUdpEp.SendReady(); epSet.Add(newUdpEp); } } break; case ep.ChannelClosed() in epSet: //delete ep; break; case nsExp.ChannelClosed(): goto quit; case terminator.Terminate(): terminator.SendAckTerminate(); goto quit; case terminator.ChannelClosed(): goto quit; } } quit: //delete nsExp; epSet.Dispose(); }