2013-10-09 2 views
0

Я использую реализацию QT стека TCP для управления роботом. Мы обмениваемся короткими сообщениями (< 200Byte) и имеем время кругового движения около 8 мс. После 10 000 пакетов в каждом направлении соединение замедляется, и я должен ждать около 1 секунды для ответа на мой пакет. Если я перезапущу свою программу и снова подключусь, я снова получаю RTM 8 мс.TCP-соединение замедляется после 10.000 пакетов

Для меня это звучит так, как будто какой-то буфер заполняется, но я не работал с TCP много, поэтому, может быть, кто-то мог бы дать мне подсказку.

+0

Вы смогли определить, является ли это вашей программой Qt, или если это робот, вызывающий задержку? – RobbieE

+0

Когда вы читаете из принимающего Tcp Connection, читаете ли вы весь буфер? Если нет, скорее всего, это может быть вашей проблемой. – TheDarkKnight

+0

@RobbieE: Как бы вы определили, кто вызывает проблему? – Foo

ответ

-2

Это просто дикая догадка, но общий улов с использованием сокетов qt заключается в том, что вам нужно удалить объект сокета самостоятельно (например, с помощью «deleteLater()») при ошибке и отключении. Пример кода:

connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater())); 

Цикл событие будет затем удалить сокет в следующий раз, когда он способен сделать это. QTcpSockets или AbstractSockets не удаляют себя при закрытии() или при выходе из области (потому что тогда Сигнал/Слоты не будут работать).

+2

Как это связано с вопросом? – RobbieE

+0

Связано это, потому что это часто делается ошибкой, используя QTcpSocket, который вызывает утечку памяти. Это объясняет, почему исправление приложения после перезагрузки. Поскольку я сказал, что это было предположение, потому что он не предоставил никакого кода. Возможно, я должен был написать комментарий вместо ответа. (Аналогичная проблема здесь: http://stackoverflow.com/questions/11781140/qtcpsocket-qtcpserver-memory- management-server-crash) – TWE

1

Проблема в коде, который вы не показываете. Вероятно, слот, который запускается на readyRead(), не освобождает буфер.

  1. Допустимо, чтобы буфер не был полностью пуст, скажем, когда вы читаете полные строки/пакеты.

  2. Невозможно постоянно увеличивать размер буфера.

В конце вашего слот слот для чтения, проверьте bytesAvailable() ненулевая. Он может быть только отличным от нуля в случае №1. Даже тогда вы должны иметь возможность установить верхнюю границу на нем - скажем, небольшой кратный размеру пакета или максимальной длины строки. Если граница когда-либо превышена, у вас есть ошибка в коде.

+0

Я прочитал все доступные данные: – Foo

+0

Я прочитал все доступные данные: char buffer [socket.bytesAvailable]; socket.read (buffer, socket.bytesAvailable()); bytesAvailable 0 после – Foo

+0

@Foo: Тогда ваша проблема в роботе. Используйте wirehark, чтобы контролировать, что происходит на проводе. Скорее всего, ответ возвращается с большой задержкой. –

Смежные вопросы