asp.net mvc - while sending and receiving telnet stream asynchronously, while loop hangs the telnet emulator -
i working on telnet emulator in web using mvc signalr, while sending , receiving telnet stream asynchronously while loop hangs page if kept long, not finish. tried many solution no luck.
below code stuck while continuously looking stream bytes.
/// <summary> /// wait data telnet server , send emulation. /// </summary> public async task readloop(string connectionid, basedecoder decoder, cancellationtoken ct, string panelid) { var client = get(connectionid); if (client == null) { return; } string script = string.empty; if (string.isnullorwhitespace(panelscript)) { panelscript = objaccn.executequerypanelscript(convert.toint32(panelid)).tostring(); script = panelscript.replace(@"\n", environment.newline); commands = regex.split(script, "\r\n"); } string loginprompt = null; if (panelid != "1") loginprompt = "login: "; else loginprompt = "name?: "; var login = commands[0];// webconfigurationmanager.appsettings["login"]; if (!_panelcommands.containskey(0)) _panelcommands.add(0, true); var passwordprompt = webconfigurationmanager.appsettings["passwordprompt"]; var password = commands[1];//webconfigurationmanager.appsettings["password"]; if (!_panelcommands.containskey(1)) _panelcommands.add(1, true); var loginauto = (!string.isnullorempty(loginprompt) && !string.isnullorempty(login)); var passwordauto = (!string.isnullorempty(passwordprompt) && !string.isnullorempty(password)); var defaultcommandsform60 = false; var defaultcommandsform50 = false; var defaultscreenm50 = false; decoder.scriptfunc = async (string str) => { if (!string.isnullorempty(str)) { if (loginauto && str.endswith(loginprompt, stringcomparison.ordinal)) { await client.streamwriter.writeasync(login + "\r\n"); loginauto = false; str = str.remove(str.length - loginprompt.length); } if (passwordauto && str.endswith(passwordprompt, stringcomparison.ordinal)) { await client.streamwriter.writeasync(password + "\r\n"); passwordauto = false; str = str.remove(str.length - passwordprompt.length); if (panelid != "1") defaultcommandsform60 = true; else defaultcommandsform50 = true; //system.threading.thread.sleep(1500); } if (panelid != "1") { if (defaultcommandsform60) { system.threading.thread.sleep(1500); await client.streamwriter.writeasync(commands[2] + "\r\n"); if (commands.length > 2) { system.threading.thread.sleep(1500); await client.streamwriter.writeasync(commands[3] + "\r\n"); } if (commands.length > 3) { system.threading.thread.sleep(1500); await client.streamwriter.writeasync(commands[4] + "\r\n"); } defaultcommandsform60 = false; } } else { if (defaultcommandsform50) { if (commands.length > 1) { // system.threading.thread.sleep(2500); if (!_panelcommands.containskey(3)) { // system.threading.thread.sleep(1500); await client.streamwriter.writeasync(commands[3] + "\r\n"); _panelcommands.add(3, true); } else { if (commands.length > 2) { if (!_panelcommands.containskey(4)) { // system.threading.thread.sleep(1500); await client.streamwriter.writeasync(commands[3] + "\r\n"); _panelcommands.add(4, true); } defaultcommandsform50 = false; } } defaultscreenm50 = true; } } else { if (defaultscreenm50) if (str.endswith("$ ")) { await client.streamwriter.writeasync("screen" + "\r\n"); str = str.remove(str.length - ("$ ").length); defaultscreenm50 = false; } } } } return str; }; const int buffersize = 4096; //if (ns.canread) //{ // byte[] readbuffer = new byte[1024]; // int numbytesread = 0; // // { // numbytesread = ns.read(readbuffer, 0, readbuffer.length); // //var data = encoding.utf8.getstring(readbuffer); // // ss= encoding.getencoding(1252).getstring(readbuffer.toarray()); // //sb.append(readbuffer[0].tostring); // sb.appendformat("{0}", encoding.ascii.getstring(readbuffer, 0, numbytesread)); // sb.replace(convert.tochar(24), ' '); // sb.replace(convert.tochar(255), ' '); // sb.replace('?', ' '); // //sb.replace(environment.newline, "<br />").tostring(); // } // while (ns.dataavailable); //} //if (client._stream.canread) //{ // // { // var inbytes = await client.readasync(buffersize, ct); // foreach (var b in inbytes) // { // await decoder.addbyte(b); // } // await decoder.flush(); // } while (client.isconnected ); ////} //disconnect(connectionid); //var readtask = client.readasync(buffersize, ct); while (client.isconnected && !ct.iscancellationrequested) { if (client._stream.canread) { var inbytes = await client.readasync(buffersize, ct); foreach (var b in inbytes) { await decoder.addbyte(b); } await decoder.flush(); } } disconnect(connectionid); } } in above method here part of code stuck , never comes end.
while (client.isconnected && !ct.iscancellationrequested) { if (client._stream.canread) { var inbytes = await client.readasync(buffersize, ct); foreach (var b in inbytes) { await decoder.addbyte(b); } await decoder.flush(); } } disconnect(connectionid); any suggestion , appreciable!
Comments
Post a Comment