public void Init() { efifo_rcv.Init(TCP_MAX_DEPTH_NUM); for (int i = 0; i < TCP_MAX_DEPTH_NUM; i++) { tyNode nnode = new tyNode(TCP_MAX_DATA_LEN); PNode <tyNode> pnode = new PNode <tyNode>(); nnode.pnode = pnode; epool_rcv.Add(pnode, nnode); } }
public byte[] GetRcvBuffer(ref int _recv_length) { if (efifo_rcv.GetValidNum() == 0) { _recv_length = 0; return(null); } else { tyNode nnode = efifo_rcv.Output(); byte[] _recv_buffer = nnode.buffer; _recv_length = nnode.length; epool_rcv.Put(nnode.pnode); return(_recv_buffer); } }
public void ThreadEntry_ServerRcv() //线程入口 { Enter_MessageQueue(is_server, false, "ThreadEntry_ServerRcv run"); while (true) { while (true) { IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(str_ip), port); //本地端地址 Listener = new TcpListener(localEP); //建立监听类,并绑定到指定的端地址 try { Listener.Start(); //开始监听 } catch (Exception ex) { Listener.Stop(); Listener = null; Enter_MessageQueue(is_server, false, "Error local IP:" + localEP.ToString() + "setup. " + ex.Message); Thread.Sleep(500); continue; } Enter_MessageQueue(is_server, false, "IP setup ok!"); DateTime listener_pending_mark; DateTime listener_pending_timeout; listener_pending_mark = DateTime.Now; while (true) { if (Listener.Pending() == false) { //为了避免每次都被tcpListener.AcceptTcpClient()阻塞线程,添加了此判断, //no connection requests have arrived //当没有连接请求时,什么也不做,有了请求再执行到tcpListener.AcceptTcpClient() listener_pending_timeout = DateTime.Now; TimeSpan ts = listener_pending_timeout - listener_pending_mark; int second_pass = ts.Minutes * 60 + ts.Seconds; if (second_pass >= 5) { Listener.Stop(); Listener = null; Enter_MessageQueue(is_server, false, "Can't find any client"); Thread.Sleep(500); break; } } else { remoteClient = Listener.AcceptTcpClient(); //等待连接(阻塞) network_stream_server = remoteClient.GetStream(); br_server_read_from_client = new BinaryReader(network_stream_server); bw_server_write_to_client = new BinaryWriter(network_stream_server); is_active = true; break; } } if (is_active == true) { break; } } Enter_MessageQueue(is_server, false, "Tcp is active!"); while (true) //循坏 接收/发送 数据 { /********************接收数据部分 Start******************/ int rcv_length; PNode <tyNode> pnode = epool_rcv.Get(); tyNode nnode = pnode.obj; try { //接收客户端发送的数据 rcv_length = br_server_read_from_client.Read(nnode.buffer, 0, TCP_MAX_DATA_LEN); } catch (Exception ex) { Enter_MessageQueue(is_server, false, "Client lost, Read fail!" + ex.Message); is_active = false; break; } #if SUPPORT_SHOW_LEN Dbg.WriteLine("Servre rcv:{0}", rcv_length); #endif #if SUPPORT_SHOW_DATA Func.DumpBuffer(efifo_rcv.Peek(), rcv_length); #endif if (rcv_length == 0) { epool_rcv.Put(pnode); Enter_MessageQueue(is_server, false, "Client lost, Read error!"); is_active = false; break; } else { nnode.length = rcv_length; efifo_rcv.Input(nnode); } /********************接收数据部分 End********************/ } } //TcpMessage(is_server, false, "ThreadEntry_ServerRcv end"); }
public void ThreadEntry_ClientRcv() { Enter_MessageQueue(is_server, false, "ThreadEntry_ClientRcv run"); while (true) { IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(str_ip), port); //远程服务器端地址; remoteServer = new TcpClient(); try { remoteServer.Connect(remoteEP); //调用connect方法连接远端服务器; } catch (Exception ex) { remoteServer.Close(); remoteServer = null; Enter_MessageQueue(is_server, false, "Can't connect to server:" + str_ip + ", " + ex.Message); Thread.Sleep(500); continue; } is_active = true; network_stream_client = remoteServer.GetStream(); bw_client_read_from_server = new BinaryReader(network_stream_client); bw_client_write_to_server = new BinaryWriter(network_stream_client); Enter_MessageQueue(is_server, false, "Connect to server successfully:" + str_ip); Dbg.WriteLine("I'm using {0}.", remoteServer.Client.LocalEndPoint); //打印自己使用的端地址 while (true) { /********************接收数据部分 Start******************/ int rcv_length; PNode <tyNode> pnode = epool_rcv.Get(); tyNode nnode = pnode.obj; try { //接受服务器发送过来的消息,注意Client已经把数据处理成字符串了! rcv_length = bw_client_read_from_server.Read(nnode.buffer, 0, TCP_MAX_DATA_LEN); } catch (Exception ex) { epool_rcv.Put(pnode); Enter_MessageQueue(is_server, false, "Server lost, Read fail!" + ex.Message); is_active = false; break; } #if SUPPORT_SHOW_LEN Dbg.WriteLine("Client rcv:{0}", rcv_length); #endif #if SUPPORT_SHOW_DATA Func.DumpBuffer(efifo_rcv.Peek(), rcv_length); #endif if (rcv_length == 0) { epool_rcv.Put(pnode); Enter_MessageQueue(is_server, false, "Server lost, Read error!"); is_active = false; break; } else { nnode.length = rcv_length; efifo_rcv.Input(nnode); } /********************接收数据部分 End********************/ } } //TcpMessage(is_server, false, "ThreadEntry_ClientRcv end"); }