Данные сокета Linux находятся в очереди отправки до истечения времени ожидания полученияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Данные сокета Linux находятся в очереди отправки до истечения времени ожидания получения

Сообщение Anonymous »

При отправке данных в качестве TCP-клиента в Linux иногда случается, что операция записи завершается успешно, но данные, похоже, остаются в буфере отправки и отправляются только по истечении тайм-аута приема. Этот вывод основан на моем использовании tcpdump для захвата пакетов и моем сборе размеров SendQ во время периода задержки. Что касается конфигурации сокета, то в настоящее время он установлен в режим блокировки отправки и включен флаг NODELAY. Кстати, серверная часть представляет собой старомодное SLIP-устройство.
данные застревают в очереди отправки
Хотелось бы знать, какие средства можно использовать для устранения этой проблемы.< /p>
Ниже находится функция отправки.

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

erpc_status_t TCPTransport::underlyingSend(const uint8_t *data, uint32_t size, void *arg)
{
int socket = (NULL == arg) ? m_socket : *(int *)arg;
if (socket < 0)
{
return kErpcStatus_InvalidArgument;
}

// Loop until all data is sent.
while (size)
{
#ifndef WIN32
ssize_t result = write(socket, data, size);
#else
int result = send_Data(socket, (char *)data, size, 0);
#endif
if (result >= 0)
{
size -= result;
data += result;
}
else
{
if (errno == EPIPE)
{
// Server closed.
//close();
TCP_DEBUG_ERR("underlyingSend() connect closed.");
return kErpcStatus_ConnectionClosed;
}
TCP_DEBUG_ERR("underlyingSend() send failed.");
return kErpcStatus_SendFailed;
}
}

return kErpcStatus_Success;
}
[erpc_tcp_transport.cpp][1]
[1]: https://github.com/EmbeddedRPC/erpc/blo ... nsport.cpp
Мне нужно добавить некоторые подробности. Я провел тест связи на предмет аномальных соединений. Когда в системе не запускались другие программы, тест провел 2 000 000 попыток связи без каких-либо отклонений. Однако проблема возникает, когда система работает как единое целое. Поэтому я все еще подозреваю, что проблема может быть вызвана перегрузкой системы или сети. Мы также попытались отследить уровень использования системных ресурсов, и это указывает на то, что ресурсов ЦП и памяти должно быть достаточно.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ve-timeout
Ответить

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

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

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

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

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