Я работаю над приложением, которое требует очень быстрого TCP-соединения между двумя компьютерами (подключенными через прямой Ethernet). Я использовал приведенный ниже код для оценки скорости реагирования TCP-сокета (как TCP-сервера, так и TCP-клиента): 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?
Заранее спасибо.
Я работаю над приложением, которое требует очень быстрого TCP-соединения между двумя компьютерами (подключенными через прямой Ethernet). Я использовал приведенный ниже код для оценки скорости реагирования TCP-сокета (как TCP-сервера, так и TCP-клиента): [b]TCP-сервер[/b] [code]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);
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) {
Console.WriteLine("Connection closed"); } [/code] Я заметил, что через 5000 циклов я случайным образом получаю задержку ответа (5–20 мс). [img] https://i.sstatic.net/1MJj2r3L.png[/img]
Я использовал WireShark для мониторинга потока TCP как на сервере, так и на клиенте. На стороне сервера TCP отправляется немедленно, но на стороне клиента возникает некоторая задержка: [b]Сторона сервера[/b] [img]https://i.sstatic.net/0ybNgRCY.png[/img]
Я работаю над приложением, которое требует очень быстрого TCP-соединения между двумя компьютерами (подключенными через прямой Ethernet). Я использовал приведенный ниже код для оценки скорости реагирования TCP-сокета (как TCP-сервера, так и...
Я работаю над приложением, которое требует очень быстрого TCP-соединения между двумя компьютерами (подключенными через прямой Ethernet). Я использовал приведенный ниже код для оценки скорости реагирования TCP-сокета (как TCP-сервера, так и...
Я использую tcpServer, указанный здесь в моем приложении C#:
У него есть класс TcpServer, который может открыть порт и начать его прослушивать. Я получаю данные через обработчик событий OnDataAvailable, предоставляемый классом TcpServer. Проблема...
Я использую Xcode 14.2 Я хочу получить все контакты с устройства и передать все контакты в API. У меня на устройстве более 2000 контактов. Из API я получу все контакты, и я хочу отфильтровать зарегистрированных (кто зарегистрировался в моем...
Я использовал SIGSTOP для тестирования системы, которая управляет состоянием процессов. Недавно я заметил, что когда я один раз отправляю SIGSTOP процессу в системе, процесс «STOPPED» все еще использует циклы ЦП в течение неопределенного периода...