0

I just search around before asking this problem, looking for example of TCP Server and Client in C#.

I found this link, I just used the given code by the link but unfortunately there's a problem and I'm stuck!

The following code is the complete code for server (console):

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; namespace TCP_Server_Console { class Program { static void Main(string[] args) { TcpListener serverSocket = new TcpListener(8888); int requestCount = 0; TcpClient clientSocket = default(TcpClient); serverSocket.Start(); Console.WriteLine(" >> Server Started"); clientSocket = serverSocket.AcceptTcpClient(); Console.WriteLine(" >> Accept connection from client"); requestCount = 0; while ((true)) { try { requestCount = requestCount + 1; NetworkStream networkStream = clientSocket.GetStream(); byte[] bytesFrom = new byte[10025]; networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); Console.WriteLine(" >> Data from client - " + dataFromClient); string serverResponse = "Last Message from client" + dataFromClient; Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); networkStream.Write(sendBytes, 0, sendBytes.Length); networkStream.Flush(); Console.WriteLine(" >> " + serverResponse); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } clientSocket.Close(); serverSocket.Stop(); Console.WriteLine(" >> exit"); Console.ReadLine(); } } } /*HandleClient Class */ using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace TCP_Server_Console { public class HandleClient { TcpClient clientSocket; string clNo; public void startClient(TcpClient inClientSocket, string clineNo) { this.clientSocket = inClientSocket; this.clNo = clineNo; Thread ctThread = new Thread(doChat); ctThread.Start(); } private void doChat() { int requestCount = 0; byte[] bytesFrom = new byte[10025]; string dataFromClient = null; Byte[] sendBytes = null; string serverResponse = null; string rCount = null; requestCount = 0; while ((true)) { try { requestCount = requestCount + 1; NetworkStream networkStream = clientSocket.GetStream(); networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); Console.WriteLine(" >> " + "From client-" + clNo + dataFromClient); rCount = Convert.ToString(requestCount); serverResponse = "Server to clinet(" + clNo + ") " + rCount; sendBytes = Encoding.ASCII.GetBytes(serverResponse); networkStream.Write(sendBytes, 0, sendBytes.Length); networkStream.Flush(); Console.WriteLine(" >> " + serverResponse); } catch (Exception ex) { Console.WriteLine(" >> " + ex.ToString()); } } } } } 

The following code is the complete code for client (Windows Forms):

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TCP_Client_Sample { public partial class Form1 : Form { System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); NetworkStream serverStream; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { label_status.Text = "Client Started, Connecting..."; try { clientSocket.Connect("127.0.0.1", 8888); if (clientSocket.Connected) { label_status.Text = "Connected"; label_status.ForeColor = Color.Green; } } catch (Exception xe) { MessageBox.Show("OOPS!!! SERVER MUST BE STARTED FIRST! \n\n" + xe.ToString()); } } //Function to Send Message to Server (On Button Click) private void btn_send_Click(object sender, EventArgs e) { try { NetworkStream serverStream = clientSocket.GetStream(); byte[] outStream = System.Text.Encoding.ASCII.GetBytes("Message From Client$"); serverStream.Write(outStream, 0, outStream.Length); serverStream.Flush(); byte[] inStream = new byte[10025]; serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); string returnData = System.Text.Encoding.ASCII.GetString(inStream); chatBox.AppendText(">> Server: " + returnData); } catch (Exception ex) { MessageBox.Show("Unable to Send Data: " + ex); } } } } 

Every time I execute the code of server it works and started. But when I execute the client, the server throws an error

Specified Argument was out of the range

Here is the complete error:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.

Parameter name: size

at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at TCP_Server_Console.Program.Main(String[] args) in C:\Users\user\Documents\Visual Studio 2015\Projects\TCP_Server_Console\TCP_Server_Console\Program.cs:line 50

I'm also getting the same error every time I click the btn_send from client form.

I am stuck here and I don't know what's the problem since this is the first time I'm work with TCP Socket.

Can anynone help me?

9
  • To me this is way to much code. Can you narrow it down to the actual important stuff? Commented May 28, 2016 at 10:47
  • @UweKeim - I'm sorry, Though it would be better to Post the Complete Code. Commented May 28, 2016 at 10:56
  • You declare the btye array as 10025, but then use recievebuffersize to read in a number of bytes, its suggesting that these are not the same. Commented May 28, 2016 at 11:12
  • @BugFinder - can you be more specific? I don't get the problem. Thank you for your time! Commented May 28, 2016 at 12:13
  • The client should not connect to the loopback address 127.0.0.1 : clientSocket.Connect("127.0.0.1", 8888);. The client needs to connect to the IP address of the PC. The server is listening at this address which may be the reason for the error. Commented May 28, 2016 at 13:32

2 Answers 2

1

The problem lies in that your code used two different sizes

byte[] inStream = new byte[10025]; serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); 

In this. Youve reserved space for 10025 bytes, but RecieveBufferSize maybe another size, bigger or smaller, but if bigger, it will error.

If you make the read call call the same length as your byte array you wont have your problem.

Sign up to request clarification or add additional context in comments.

Comments

0
 byte[] inStream = new byte[10025]; byte[] tStream = new byte[(int)clientSocket.ReceiveBufferSize]; serverStream.Read(tStream, 0, (int)clientSocket.ReceiveBufferSize); 

Would be the quick easy fix to ensure that the byte buffer its reading into will always be the correct size needed.

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.