Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

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 :)

  • 3 weeks later...
  • Administrators
Posted

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.

Posting Guidelines FAQ Post Formatting

 

Intellectuals solve problems; geniuses prevent them.

-- Albert Einstein

Posted

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! :)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...