[ Pharos @ 14.11.2007. 20:33 ] @
Evo opet ja smaram sa threadovima.. Hoću da se telnetujem na neki host i da šaljem podatke i da obrađujem primljene podatke. Za test sam koristio sezamov telnet servis. Telnetujem se, pošaljem mu ime, i ako u njegovom responsu pronađem određeni string, radim nešto. Napravio sam klasu za telnetovanje u kojoj imam promenjivu XXX tipa int i def. vrednost 1. Pošaljem komandu john.doe (za logovanje) i ako u responsu dobijem string koji počinje sa john.doe (recimo john.doe nije korisnik...) vrednost promenljive XXX se promeni na 2. Sledi kod moje klase Code: using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.Windows.Forms; namespace WindowsApplication8 { class Telnet { public int XXX = 1; public Telnet() { connect(); } #region Deklaracije Char IAC = Convert.ToChar(255); Char DO = Convert.ToChar(253); Char DONT = Convert.ToChar(254); Char WILL = Convert.ToChar(251); Char WONT = Convert.ToChar(252); Char SB = Convert.ToChar(250); Char SE = Convert.ToChar(240); const Char IS = '0'; const Char SEND = '1'; const Char INFO = '2'; const Char VAR = '0'; const Char VALUE = '1'; const Char ESC = '2'; const Char USERVAR = '3'; string m_strResp; private ArrayList m_ListOptions = new ArrayList(); private IPEndPoint iep; private AsyncCallback callbackProc; private string address; private int port; private Socket s; Byte[] m_byBuff = new Byte[32767]; #endregion private void connect() { address = "sezampro.yu"; port = 23; IPHostEntry IPHost = Dns.Resolve(address); string[] aliases = IPHost.Aliases; IPAddress[] addr = IPHost.AddressList; try { // Create New Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Create New EndPoint iep = new IPEndPoint(addr[0], port); // This is a non blocking IO s.Blocking = true; // Assign Callback function to read from Asyncronous Socket callbackProc = new AsyncCallback(ConnectCallback); // Begin Asyncronous Connection s.BeginConnect(iep, callbackProc, s); } catch (Exception eeeee) { MessageBox.Show(eeeee.Message, "Application Error!!!", MessageBoxButtons.OK, MessageBoxIcon.Stop); Application.Exit(); } } public void ConnectCallback(IAsyncResult ar) { try { // Get The connection socket from the callback Socket sock1 = (Socket)ar.AsyncState; if (sock1.Connected) { // Define a new Callback to read the data AsyncCallback recieveData = new AsyncCallback(OnRecievedData); // Begin reading data asyncronously sock1.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock1); } } catch (Exception ex) { MessageBox.Show("Setup Recieve callbackProc failed!"); } } public void OnRecievedData(IAsyncResult ar) { // Get The connection socket from the callback Socket sock = (Socket)ar.AsyncState; // Get The data , if any int nBytesRec = sock.EndReceive(ar); if (nBytesRec > 0) { string sRecieved = Encoding.ASCII.GetString(m_byBuff, 0, nBytesRec); string m_strLine = ""; for (int i = 0; i < nBytesRec; i++) { Char ch = Convert.ToChar(m_byBuff[i]); switch (ch) { case '\r': m_strLine += Convert.ToString("\r\n"); break; case '\n': break; default: m_strLine += Convert.ToString(ch); break; } } try { int strLinelen = m_strLine.Length; if (strLinelen == 0) { m_strLine = Convert.ToString("\r\n"); } Byte[] mToProcess = new Byte[strLinelen]; for (int i = 0; i < strLinelen; i++) mToProcess[i] = Convert.ToByte(m_strLine[i]); // Process the incoming data string mOutText = ProcessOptions(mToProcess); if (mOutText != "") { parsirajTekst(mOutText); //MessageBox.Show(mOutText); } // Respond to any incoming commands RespondToOptions(); } catch (Exception ex) { Object x = this; MessageBox.Show(ex.Message, "Information!"); } } else { // If no data was recieved then the connection is probably dead Console.WriteLine("Disconnected", sock.RemoteEndPoint); sock.Shutdown(SocketShutdown.Both); sock.Close(); Application.Exit(); } } private void parsirajTekst(string s) { char[] newLineSplitter = { '\n' }; char[] spaceSplitter = { ' ' }; char[] xSplitter = { ' ', 'x' }; string[] line = s.Split(newLineSplitter, StringSplitOptions.RemoveEmptyEntries); foreach (string l in line) { if (l.StartsWith("john.doe")) { XXX = 2; } } } private string ProcessOptions(byte[] m_strLineToProcess) { string m_DISPLAYTEXT = ""; string m_strTemp = ""; string m_strOption = ""; string m_strNormalText = ""; bool bScanDone = false; int ndx = 0; int ldx = 0; char ch; try { for (int i = 0; i < m_strLineToProcess.Length; i++) { Char ss = Convert.ToChar(m_strLineToProcess[i]); m_strTemp = m_strTemp + Convert.ToString(ss); } while (bScanDone != true) { int lensmk = m_strTemp.Length; ndx = m_strTemp.IndexOf(Convert.ToString(IAC)); if (ndx > lensmk) ndx = m_strTemp.Length; if (ndx != -1) { m_DISPLAYTEXT += m_strTemp.Substring(0, ndx); ch = m_strTemp[ndx + 1]; if (ch == DO || ch == DONT || ch == WILL || ch == WONT) { m_strOption = m_strTemp.Substring(ndx, 3); string txt = m_strTemp.Substring(ndx + 3); m_DISPLAYTEXT += m_strTemp.Substring(0, ndx); m_ListOptions.Add(m_strOption); m_strTemp = txt; } else if (ch == IAC) { m_DISPLAYTEXT = m_strTemp.Substring(0, ndx); m_strTemp = m_strTemp.Substring(ndx + 1); } else if (ch == SB) { m_DISPLAYTEXT = m_strTemp.Substring(0, ndx); ldx = m_strTemp.IndexOf(Convert.ToString(SE)); m_strOption = m_strTemp.Substring(ndx, ldx); m_ListOptions.Add(m_strOption); m_strTemp = m_strTemp.Substring(ldx); } } else { m_DISPLAYTEXT = m_DISPLAYTEXT + m_strTemp; bScanDone = true; } } m_strNormalText = m_DISPLAYTEXT; } catch (Exception eP) { MessageBox.Show(eP.Message, "Application Error!!!", MessageBoxButtons.OK, MessageBoxIcon.Stop); Application.Exit(); } return m_strNormalText; } public void DispatchMessage(string strText) { try { Byte[] smk = new Byte[strText.Length]; for (int i = 0; i < strText.Length; i++) { Byte ss = Convert.ToByte(strText[i]); smk[i] = ss; } IAsyncResult ar2 = s.BeginSend(smk, 0, smk.Length, SocketFlags.None, callbackProc, s); s.EndSend(ar2); } catch (Exception ers) { MessageBox.Show("ERROR IN RESPOND OPTIONS"); } } void RespondToOptions() { try { string strOption; for (int i = 0; i < m_ListOptions.Count; i++) { strOption = (string)m_ListOptions[i]; ArrangeReply(strOption); } DispatchMessage(m_strResp); m_strResp = ""; m_ListOptions.Clear(); } catch (Exception ers) { MessageBox.Show("ERROR IN RESPOND OPTIONS"); } } void ArrangeReply(string strOption) { try { Char Verb; Char Option; Char Modifier; Char ch; bool bDefined = false; if (strOption.Length < 3) return; Verb = strOption[1]; Option = strOption[2]; if (Option == 1 || Option == 3) { // case 1: // Echo // case 3: // Suppress Go-Ahead bDefined = true; // break; } m_strResp += IAC; if (bDefined == true) { if (Verb == DO) { // case DO: ch = WILL; m_strResp += ch; m_strResp += Option; // break; } if (Verb == DONT) { ch = WONT; m_strResp += ch; m_strResp += Option; // break; } if (Verb == WILL) { ch = DO; m_strResp += ch; m_strResp += Option; //break; } if (Verb == WONT) { ch = DONT; m_strResp += ch; m_strResp += Option; // break; } if (Verb == SB) { Modifier = strOption[3]; if (Modifier == SEND) { ch = SB; m_strResp += ch; m_strResp += Option; m_strResp += IS; m_strResp += IAC; m_strResp += SE; } // break; } } else { // switch(Verb) // { if (Verb == DO) { ch = WONT; m_strResp += ch; m_strResp += Option; // break; } if (Verb == DONT) { ch = WONT; m_strResp += ch; m_strResp += Option; // break; } if (Verb == WILL) { ch = DONT; m_strResp += ch; m_strResp += Option; // break; } if (Verb == WONT) { ch = DONT; m_strResp += ch; m_strResp += Option; // break; } } } catch (Exception eeeee) { MessageBox.Show(eeeee.Message, "Application Error!!!", MessageBoxButtons.OK, MessageBoxIcon.Stop); Application.Exit(); } } } } U nekoj mojoj test formi imam sledeće Code: private Telnet t; public Form1() { InitializeComponent(); t = new Telnet(); } private void button1_Click(object sender, EventArgs e) { t.DispatchMessage("john.doe"); t.DispatchMessage("\r\n"); MessageBox.Show(t.XXX.ToString()); } Kada kliknem prvi put na button, pročitam vrednost 1 iako bi trebala da bude 2, a drugi put kad kliknem, normalno pročita dvojku. Znam da nešto ne valja kod threadova samo nikad se njima nisam ozbiljnije bavio pa da znam šta to. |