Insufficient listener buffer size should be taken into consideration. Messages longer than buffer size also triggers OP excetion
On the following sample, if we reduce maxBufferSize from 1024 to just 10 and send a message of 11 bytes, we also get Unable to read data from the transport connection : An existing connection was forcibly closed by the remote host is raised exception.
internal class MyTcpListener
{
static void Main(string[] args)
{
// Set the TcpListener on port 13000.
IPAddress serverAddress = IPAddress.Parse("127.0.0.1");
int serverPort = 13000;
int maxBufferSize = 1024;
launchTcpListener(serverAddress, serverPort, maxBufferSize);
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
// https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.tcplistener?view=net-7.0
private static void launchTcpListener(IPAddress serverAddress, int serverPort, int maxBufferSize)
{
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
TcpListener server = null;
try
{
// TcpListener server = new TcpListener(port);
server = new TcpListener(serverAddress, serverPort);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[maxBufferSize];
String data = null;
// Enter the listening loop.
while (true)
{
Console.WriteLine("Listening at {0}:{1}", serverAddress, serverPort);
// Perform a blocking call to accept requests.
// You could also use server.AcceptSocket() here.
using (TcpClient client = server.AcceptTcpClient())
{
Console.WriteLine("Connected!");
data = null;
// Get a stream object for reading and writing
NetworkStream stream = client.GetStream();
int receivedBytes;
// Loop to receive all the data sent by the client.
while ((receivedBytes = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.UTF8.GetString(bytes, 0, receivedBytes);
string currentTime = DateTime.Now.ToString();
Console.WriteLine("At {0} received: {1}", currentTime, data);
// Processamento de dados
// Embora seja facultativo, mas deve enviar-se feedback quanto à validade dos pedidos
// Nesta amostra isto a devolver os dados recebidos
byte[] responseData = System.Text.Encoding.UTF8.GetBytes(data);
stream.Write(responseData, 0, responseData.Length);
Console.WriteLine("Server response: {0}", data);
}
}
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
server?.Stop();
}
}
}