JCDenton Posted February 3, 2005 Posted February 3, 2005 i found a piece of code on the web that was designed to show the basic functionality of the socket class, so I decided to comment the code as it was uncommented and see where I would be struggling... private void btnListen_Click(object sender, System.EventArgs e) { //starts the server btnListen.Enabled = false; btnConnect.Enabled = false; txtServerIP.Enabled = false; myThread = new Thread(new ThreadStart(RunListener)); myThread.Start(); //thread listening for incoming connections } private void RunListener() { //get ready for connections myListener = new TcpListener(IPAddress.Any, 9000); //accept from any ip on port 9000 myListener.Start(); //start tcp listener lstChat.Items.Add("Listening for a client..."); //notify user while (!myListener.Pending()) //this loops runs while the listener is waiting for incoming connections { Thread.Sleep(100); //wait a while to mitigate the load on system resources } lstChat.Items.Add("Connecting..."); //notify user myClient = myListener.AcceptTcpClient(); //defined globally in the form class definition [???] //as an instance of the tcpClient class [protected] myThread = new Thread(new ThreadStart(ReceiveData)); //prepare for incoming data myThread.Start(); //incoming data thread } private void ReceiveData() { //this is the most discombobulating thread in the program //IMHO int i; //not sure what it is used for string sStreamString; //:S byte[] baData = new byte[1024]; //byte array with 1024 elements... myStream = myClient.GetStream(); // myStream is a netWork Stream [protected] //attaches a stream to the tcpClient lstChat.Items.Add("Connected!"); //notify user while (true) //run infinite loop until the peer decides to close { i = myStream.Read(baData, 0, baData.Length); //I'm gonna guess here... ...this reads the first Kb [array of 1024 bytes...] of the incoming data and assigns the contents to an int???? :S or does i contain the length of the read data...? sStreamString = Encoding.ASCII.GetString(baData); //sStreamString now contains the byte array contents... converted into/read as ASCII keycodes.... if (sStreamString.IndexOf("/close") == 0) //if /close is found then break the loop as we are closing? { break; } lstChat.Items.Add("<< " + sStreamString); //show the contents of the string } //we received the close command so confirm it baData = Encoding.ASCII.GetBytes("/close"); //fill our byte array with the close command myStream.Write(baData, 0, baData.Length); //write this from pos 0...? myStream.Close(); myClient.Close(); //dont need tcp client and network stream no more lstChat.Items.Add("Connection closed."); //notify user } private void btnConnect_Click(object sender, System.EventArgs e) //clicked to connect { btnListen.Enabled = false; txtServerIP.Enabled = false; btnConnect.Enabled = false; lstChat.Items.Add("Connecting..."); //notify user myClient = new TcpClient(txtServerIP.Text, 9000); //connect....what if it fails to connect? try + catch? myThread = new Thread(new ThreadStart(ReceiveData)); //go check for incoming data myThread.Start(); } private void btnSend_Click(object sender, System.EventArgs e) { if (txtMessage.Text != "") //aslong as we have a msg to send { byte[] baData = new byte[2]; //a two byte array..?:S baData = Encoding.ASCII.GetBytes(txtMessage.Text); //load msg into byte array... myStream.Write(baData, 0, baData.Length); //send the contents of the byte array..from pos 0 to the end.. lstChat.Items.Add(">> " + txtMessage.Text); txtMessage.Clear(); txtMessage.Focus(); //obvious } else txtMessage.Focus(); //we have no msg } 1) It seems to be missing code to check whether there is a connection before sending which might be a good idea incase the connection is lost... Would a try/catch block solve this? 2)The amount of data send seems to be limited to a single Kb [i wouldnt go much larger] as a byte array is used with 1024 elements.. 3)I'm not sure why a byte array is used of only 2 elements which contains the data to be send... 4) What happens if the data arrival loop is executing while data is still missing. Would the following be a solution? : Data Arrives Get the first byte denoting the amount of chars contained in the message If the array does not contain that much data yet continue adding to the array [somehow] 5) How would one go about setting up a tcp server to accept multiple connections? simply create an array of threads [resources consuming?] or would the threads also need variable arrays as otherwise each thread element in the thread array would be accessing the same variable? (hope that made sense) Thank you :) Quote
JCDenton Posted February 20, 2005 Author Posted February 20, 2005 I'd be very interested in the answer to #5 so if anyone knows...... thanx in advance :) Quote
Administrators PlausiblyDamp Posted February 20, 2005 Administrators Posted February 20, 2005 For point 5 you could have a single listener that would spawn a new thread for each incomming request and destroy the thread when the client disconnects / timesout. This could get resource hungry but that depends on how many clients you need to support. Looking over the code though it does seem to have some oddities - assigning a value to i (the number of bytes read) and never using it, not sure about the byte array of 2 bytes either. Using a 1K byte array is probably so the data can be snt / received in chunks over the network. If you search these forums (have a look in the code library) I'm sure somebody has posted an example of a basic network app. Quote Posting Guidelines FAQ Post Formatting Intellectuals solve problems; geniuses prevent them. -- Albert Einstein
Diesel Posted February 20, 2005 Posted February 20, 2005 Async callbacks are 10 times faster than threads (at least for this specific program design) Get a TCP/IP Book! Quote
JCDenton Posted February 21, 2005 Author Posted February 21, 2005 Thanx PlausiblyDamp :) Getting a tcp/ip book would be beneficial to the current knowledge that I have of the protocol so it's a good idea but, at the moment I need to know how to deal with multiple connections in c#.... Any tutorial links would also be very much appreciated! :) Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.