public void QueryAsync(ClientCommData data) { lock (Port) { //convert the request data as an ordinary byte array byte[] outgoing = data.OutgoingData.ToArray(); //phyiscal writing Port.BeginSend(outgoing, 0, outgoing.Length, SocketFlags.None, OnSend, null); //read the incoming data from the physical port Port.BeginReceive(tcpAsyClBuffer, 0, tcpAsyClBuffer.Length, SocketFlags.None, OnReceive, data); } //lock }
/// <summary> /// Entry-point for submitting a query to the remote device /// </summary> /// <param name="data"></param> /// <returns></returns> public CommResponse Query(ClientCommData data) { lock (Port) { //convert the request data as an ordinary byte array byte[] outgoing = data.OutgoingData.ToArray(); //create a writer for accumulate the incoming data var incoming = new ByteArrayWriter(); const int tempSize = 256; var temp = new byte[tempSize]; //retries loop for (int attempt = 0, retries = data.Retries; attempt < retries; attempt++) { //phyiscal writing Port.Send(outgoing); incoming.Reset(); //start the local timer bool timeoutExpired; int totalTimeout = Latency + data.Timeout; using (new Timer(_ => timeoutExpired = true, null, totalTimeout, Timeout.Infinite)) { //reception loop, until a valid response or timeout timeoutExpired = false; while (timeoutExpired == false) { var length = Port.Available; if (length > 0) { if (length > tempSize) length = tempSize; //read the incoming data from the physical port Port.Receive(temp, length, SocketFlags.None); //append data to the writer incoming.WriteBytes(temp, 0, length); //try to decode the stream data.IncomingData = incoming.ToReader(); CommResponse result = data.OwnerProtocol.Codec.ClientDecode(data); //exit whether any concrete result: either good or bad if (result.Status == CommResponse.Ack) { return result; } if (result.Status == CommResponse.Critical) { return result; } if (result.Status != CommResponse.Unknown) { break; } } Thread.Sleep(0); //stop immediately if the host asked to abort //TODO } } //using (timer) } //for //no attempt was successful return new CommResponse( data, CommResponse.Critical); } //lock }
/// <summary> /// Entry-point for submitting a query to the remote device /// </summary> /// <param name="data"></param> /// <returns></returns> public CommResponse Query(ClientCommData data) { lock (Port) { //convert the request data as an ordinary byte array byte[] outgoing = data .OutgoingData .ToArray(); //create a writer for accumulate the incoming data var incoming = new ByteArrayWriter(); const int tempSize = 256; var temp = new byte[tempSize]; //retries loop for (int attempt = 0, retries = data.Retries; attempt < retries; attempt++) { //flush any residual content Port .DiscardInBuffer(); Port .DiscardOutBuffer(); //phyiscal writing Port .Write(outgoing, 0, outgoing.Length); incoming.Reset(); Thread.Sleep(100); //start the local timer bool timeoutExpired; int totalTimeout = Latency + data.Timeout; using (Timer timer = new Timer( _ => timeoutExpired = true, state: null, dueTime: totalTimeout, period: Timeout.Infinite)) { //reception loop, until a valid response or timeout timeoutExpired = false; while (timeoutExpired == false) { int length = Port.BytesToRead; if (length > 0) { if (length > tempSize) { length = tempSize; } //read the incoming data from the physical port Port .Read(temp, 0, length); //append data to the writer incoming.WriteBytes( temp, 0, length); //try to decode the stream data.IncomingData = incoming.ToReader(); CommResponse result = data .OwnerProtocol .Codec .ClientDecode(data); //exit whether any concrete result: either good or bad if (result.Status == CommResponse.Ack) { return(result); } else if (result.Status == CommResponse.Critical) { return(result); } else if (result.Status != CommResponse.Unknown) { break; } } Thread.Sleep(100); //stop immediately if the host asked to abort //TODO } } //using (timer) } //for //no attempt was successful return(new CommResponse( data, CommResponse.Critical)); } //lock }
public void QueryAsync(ClientCommData data) { throw new System.NotImplementedException(); }