void DoWorking(object args) { status = ESrvStatus.Working; //大循环 while (status != ESrvStatus.Stoping) { //循环直到队列为空,之后线程短暂休眠避免抢占cpu时间 while (!iQueue.IsEmpty) { //尝试从队列取出 if (iQueue.TryDequeue(out DataPacket dp)) { LogHelper.Logging("ForwardSrv: Dequeue!"); //查转发表 EndPoint remoteEP = ForwardTable.GetEPByAddr(dp.DstAddr, dp.DstPort); //!!!注意转发表线程安全 if (remoteEP != null) { //发送数据 //省略分段 DataSocket.Socket.SendTo(dp.RawData, remoteEP); } else { //查询不到EP 目标不可达 LogHelper.Logging("DstAddr Unreachable(EP): " + BitConverter.ToString(dp.DstAddr) + ":" + BitConverter.ToString(dp.DstPort)); //!!地址格式化 } } } //休眠 Thread.Sleep(10); } status = ESrvStatus.Stoped; }
void DoWorking(object args) { status = ESrvStatus.Working; //大循环 while (status != ESrvStatus.Stoping) { //循环直到队列为空,之后线程短暂休眠避免抢占cpu时间 while (!iQueue.IsEmpty) { //尝试从队列取出 if (iQueue.TryDequeue(out DataPacket dp)) { LogHelper.Logging("EchoSrv: Dequeue!"); //交换Src Dst byte[] swap = dp.DstAddr; dp.DstAddr = dp.SrcAddr; dp.SrcAddr = swap; swap = dp.DstPort; dp.DstPort = dp.SrcPort; dp.SrcPort = swap; //交给路由队列 //先写死用0号服务 反正就是个echo(逃 RoutingSrv.SrvPool[0].InputQueue.Enqueue(dp); } } //休眠 Thread.Sleep(10); } status = ESrvStatus.Stoped; }
void DoWorking(object args) { status = ESrvStatus.Working; //大循环 while (status != ESrvStatus.Stoping) { //循环直到队列为空,之后线程短暂休眠避免抢占cpu时间 while (!iQueue.IsEmpty) { //尝试从队列取出 if (iQueue.TryDequeue(out DataPacket dp)) { LogHelper.Logging("RoutingSrv: Dequeue!"); //路由 ConcurrentQueue <DataPacket> oQueue = RoutingTable.GetQueueByAddr(dp.DstAddr, dp.DstPort); //!!!注意路由表线程安全 if (oQueue != null) { //交给目标队列 oQueue.Enqueue(dp); } else { //查询不到路由 目标不可达 LogHelper.Logging("DstAddr Unreachable: " + BitConverter.ToString(dp.DstAddr) + ":" + BitConverter.ToString(dp.DstPort)); //!!地址格式化 } } } //休眠 Thread.Sleep(10); } status = ESrvStatus.Stoped; }
public ForwardSrv() { //设置状态 status = ESrvStatus.Initializing; //InputQueue iQueue = new ConcurrentQueue <DataPacket>(); //设置SrvPool SrvPool.Add(this); //设置状态 status = ESrvStatus.Initialized; }
void DoWorking(object args) { status = ESrvStatus.Working; //大循环 while (status != ESrvStatus.Stoping) { //循环直到队列为空,之后线程短暂休眠避免抢占cpu时间 while (!iQueue.IsEmpty) { //尝试从队列取出 if (iQueue.TryDequeue(out DataPacket dp)) { #if DEBUG LogHelper.Logging("ProxySrv: Dequeue!"); #endif switch (((ProxyPacket)dp).State) { case ProxyPacketState.TCP_Connect: //握手 sessionTable.Add(new SessionItem()); break; case ProxyPacketState.TCP_Connect_Success: break; case ProxyPacketState.TCP_Data: break; case ProxyPacketState.TCP_Fin: break; case ProxyPacketState.TCP_Rst: break; default: break; } } } //休眠 Thread.Sleep(10); } status = ESrvStatus.Stoped; }