Задержка при получении TCP-строки, отправленной с TCPServerC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Задержка при получении TCP-строки, отправленной с TCPServer

Сообщение Anonymous »

Я работаю над приложением, которое требует очень быстрого TCP-соединения между двумя компьютерами (подключенными через прямой Ethernet). Я использовал приведенный ниже код для оценки скорости реагирования TCP-сокета (как TCP-сервера, так и TCP-клиента):
TCP-сервер

Код: Выделить всё

class Program
{
static void Main(string[] args)
{
string serverAddress = "192.168.23.88"; // Localhost
int serverPort = 6012;

TcpListener server = new TcpListener(IPAddress.Parse(serverAddress), serverPort);
server.Server.NoDelay = true;
server.Start();
Console.WriteLine($"Server started {serverAddress}:{serverPort}...");

while (true)
{
var client = server.AcceptTcpClient();
client.NoDelay = true;
Console.WriteLine("Client connected...");
HandleClientAsync(client); // Fire and forget
}
}

private static void HandleClientAsync(TcpClient client)
{
using (client)
{
var buffer = new byte[20];
var stream = client.GetStream();

var t1RP = Encoding.UTF8.GetBytes("");
var t2RP = Encoding.UTF8.GetBytes("");
var t3RP = Encoding.UTF8.GetBytes("");

List consoleList = new List();
//string tmp = "";
while (true)
{
int bytesRead;
try
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
}
catch (Exception e)
{
Console.WriteLine($"Error reading from client: {e.Message}");
foreach (var a in consoleList)
Console.WriteLine(a);

break;
}

stream.Write(sovRP, 0, t1RP.Length);
stream.Write(grbRP, 0, t2RP.Length);
stream.Write(resRP, 0, t3RP.Length);
}
}
}
}
TCP-клиент

Код: Выделить всё

static async Task Main(string[] args)
{
string serverAddress = "192.168.23.88"; // Localhost
int serverPort = 6012;

using (TcpClient client = new TcpClient())
{
try
{
int cycle = 5000;
client.NoDelay = true;
Console.WriteLine("Connecting to server...");
await client.ConnectAsync(serverAddress, serverPort);
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} Connected to server {serverAddress}:{serverPort}");

Stopwatch time = new Stopwatch();
Stopwatch elapsedTime = new Stopwatch();

var stream = client.GetStream();
int count = 0;
{
byte[] buffer = new byte[20];
for (int i = 0; i < cycle; ++i)
{
long responseTime = 0;
long grabTime = 0;
long resultTime = 0;
byte[] data = Encoding.UTF8.GetBytes($"");
stream.Write(data, 0, data.Length);
_ = stream.FlushAsync();

elapsedTime.Restart();

string combined = "";
while (true)
{
int bytesRead = stream.Read(buffer, 0, buffer.Length);
combined += Encoding.UTF8.GetString(buffer, 0, bytesRead);
if (combined.Contains(""))
{
_ = stream.FlushAsync();
responseTime = elapsedTime.ElapsedMilliseconds;
combined = combined.Replace("", "");
if (responseTime >  3)
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} SOV Response Time {responseTime}");
responseTime = elapsedTime.ElapsedMilliseconds;
count++;
}
break;
}
}
//Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} Received from server: {response}");

while (true)
{
int bytesRead = stream.Read(buffer, 0, buffer.Length);
combined += Encoding.UTF8.GetString(buffer, 0, bytesRead);
if (combined.Contains(""))
{
grabTime = elapsedTime.ElapsedMilliseconds - responseTime;
combined = combined.Replace("", "");
if (grabTime > 3)
{
_ = stream.FlushAsync();
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} SOV Grab Time {grabTime}");
grabTime = elapsedTime.ElapsedMilliseconds - responseTime;
count++;
}
break;
}
}
//Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} Received from server: {response}");

while (true)
{
int bytesRead = stream.Read(buffer, 0, buffer.Length);
combined += Encoding.UTF8.GetString(buffer, 0, bytesRead);
if (combined.Contains(""))
{
resultTime = elapsedTime.ElapsedMilliseconds - responseTime - grabTime;
combined = combined.Replace("", "");
if (resultTime > 10)
{
_ = stream.FlushAsync();
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} SOV Result Time {resultTime}");
resultTime = elapsedTime.ElapsedMilliseconds - responseTime - grabTime;
count++;
}
break;
}
}
//Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} Received from server: {response}");

time.Restart();
while (time.ElapsedMilliseconds < 50)
{

}

if ((i % 50) == 0)
Console.WriteLine($"Complete {i} Cycle");
}
}
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} Completed {cycle} Cycle, Exceed Count {count}");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}

Console.WriteLine("Connection closed");
}
Я заметил, что через 5000 циклов я случайным образом получаю задержку ответа (5–20 мс).
Изображение

Я использовал WireShark для мониторинга потока TCP как на сервере, так и на клиенте. На стороне сервера TCP отправляется немедленно, но на стороне клиента возникает некоторая задержка:
Сторона сервера
Изображение

Клиентская сторона
Изображение

Есть ли что-то, что я упустил в конфигурации TCP?
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -tcpserver
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Задержка при получении TCP-строки, отправленной с TCPServer
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Задержка при получении TCP-строки, отправленной с TCPServer
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • TcpServer: как отправить что-то и впоследствии закрыть TCP-соединение
    Anonymous » » в форуме C#
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Задержка при получении контактов с устройства, передаче их в API и получении ответа.
    Anonymous » » в форуме IOS
    0 Ответы
    101 Просмотры
    Последнее сообщение Anonymous
  • Задержка действия SIGSTOP не ограничена при первой отправке один раз, но задержка является немедленной при второй отправ
    Anonymous » » в форуме Linux
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»