c# - Async Tcp Server cannot receive data -
i tyring create multi threading , async tcp server implements tcpl listener
current server working intended able send data server transmit data client out problems
however after have sent data server , sent data client, when client sends data server again server unabe pick data
i have tried days find answer problem no luck
here code using in server:
using system; using system.collections.generic; using system.linq; using system.text; using system.net; using system.net.sockets; using system.threading; using system.windows.forms; using system.io; namespace mytcpasyncclass { public class stateobject { public tcpclient mytcpclient = null; public networkstream mynetworkstream = null; public const int mybuffersize = 1024; public byte[] mybuffer = new byte[mybuffersize]; public string requeststring = ""; public stringbuilder mystringbuilder = new stringbuilder(); char[] requestchars; // char array of request const char stx = (char)0x02; // start character const char ftx = (char)0x03; // finish character public void dispose() { try { mytcpclient.close(); mynetworkstream.close(); mynetworkstream.dispose(); } catch (exception ex) { messagebox.show("message:\n" + ex.message + "\n\nstacktrace:\n" + ex.stacktrace); } } } public static class asyncserverfunctions { private static int mport = 0; private static manualresetevent mymanualresetevent = new manualresetevent(false); public static void startlistening() { //catch tcp client connection try { //get database connection //myreaderwriterlockslim.enterreadlock(); loadsettings(); //myreaderwriterlockslim.exitreadlock(); tcplistener mytcplistener = new tcplistener(ipaddress.any, mport); mytcplistener.start(); while (true) { //set event nonsignaled state mymanualresetevent.reset(); //start asynchronous tcplistener listen connection mytcplistener.beginaccepttcpclient(accepttcpclientcallback, mytcplistener); //wait until connection made before continuing mymanualresetevent.waitone(); } mytcplistener.stop(); } catch (exception ex) { adderrorlog(ex.message, ex.stacktrace); } } private static void accepttcpclientcallback(iasyncresult result) { try { //beginaccepttcpclientcallback //signal main thread continue mymanualresetevent.set(); //get tcpclientnetworkstream: tcplistener mytcplistener = (tcplistener)result.asyncstate; //finish async client process tcpclient mytcpclient = mytcplistener.endaccepttcpclient(result); stateobject mystateobject = new stateobject(); mystateobject.mytcpclient = mytcpclient; mystateobject.mynetworkstream = mytcpclient.getstream(); //begin async read networkstream mystateobject.mynetworkstream.beginread(mystateobject.mybuffer, 0, stateobject.mybuffersize, new asynccallback(beginreadcallback), mystateobject); } catch (exception ex) { adderrorlog(ex.message, ex.stacktrace); } } private static void beginreadcallback(iasyncresult result) { stateobject mystateobject = (stateobject)result.asyncstate; networkstream mynetworkstream = mystateobject.mynetworkstream; string myrequeststring = ""; try { //get request data here if (mystateobject.mybuffer.length > 0) { //store data recived mystateobject.mystringbuilder.clear(); mystateobject.mystringbuilder.append(encoding.ascii.getstring(mystateobject.mybuffer)); //get stored request string myrequeststring = mystateobject.mystringbuilder.tostring(); //record string recived databasefunctions.addmessagelog("string recived (beginreadcallback): " + myrequeststring); //remove first , last character myrequeststring = cleanstring(myrequeststring); //record request string databasefunctions.addmessagelog("request string recived:" + myrequeststring); //get message identifier string messageidentifier = ""; messageidentifier = myrequeststring.substring(0, 2); switch (messageidentifier) { case "value": sendresponse(mystateobject, startup(messageidentifier, myrequeststring)); sendresponse(mystateobject, sendtransactionstart(messageidentifier, myamount)); getresponse(mystateobject); break; default: //***default case*** sendresponse(mystateobject, defaultcase(myrequeststring)); break; } //dispose of connection mystateobject.dispose(); } } catch (exception ex) { adderrorlog(ex.message, ex.stacktrace); try { mystateobject.dispose(); } catch { adderrorlog(ex.message, ex.stacktrace); } } } private static void sendresponse(stateobject pmystateobject, string presponsestring) { try { //send response client //get bytes string sent byte[] myresponsebytes = encoding.ascii.getbytes(presponsestring); //get network stream networkstream mynetworkstream = pmystateobject.mynetworkstream; //call sendresponsecallback mynetworkstream.beginwrite(myresponsebytes, 0, myresponsebytes.length, new asynccallback(sendresponsecallback), pmystateobject); } catch (exception ex) { adderrorlog(ex.message, ex.stacktrace); } } private static void getresponse(stateobject pstateobject) { //this run new asynccallback response client networkstream mynetworkstream = pstateobject.mynetworkstream; pstateobject.mybuffer = new byte[1024]; mynetworkstream.beginread(pstateobject.mybuffer, 0, pstateobject.mybuffer.length, new asynccallback(beginreadcallback), pstateobject); } private static void sendresponsecallback(iasyncresult result) { try { //end send procedure stateobject mystateobject = (stateobject)result.asyncstate; networkstream mynetworkstream = mystateobject.mynetworkstream; mynetworkstream.flush(); } catch (exception ex) { adderrorlog(ex.message, ex.stacktrace) } } private static void showexceptionmessage(string pmessage, string pstacktrace) { messagebox.show("message:\n" + pmessage + "\n\nstacktrace:\n" + pstacktrace); } private static void adderrorlog(string pmessage, string pstacktrace) { databasefunctions.addmessagelog("message:" + pmessage + "; stacktrace:" + pstacktrace); } } } thanks all
you should call beginaccepttcpclient in accepttcpclientcallback also. don't accept new connection after first one.
Comments
Post a Comment