Имеется TCP-сервер. К нему коннектятся клиенты, идет обмен данными и разрыв коннекта.
После некоторого количество сеансов связи сервер перестает принимать соединения. Похоже, что в системе кончаютя сокеты, хотя моя программа их закрывает.
В файле /proc/net/tcp видно большое количество сокетов. Примерно через минуту эти сокеты пропадают из /proc/net/tcp и сервер продолжает работу.
Debian Lenny
uname -a
Linux ivan 2.6.26-2-686 #1 SMP Sat Jun 11 14:54:10 UTC 2011 i686 GNU/Linux
Кончаются сокеты в системе
На чем пишете приложение?
C++, QT 4.7.0
Может быть вы удаляете некие объекты при помощи deleteLater()? И они ждут когда будет время а удаление.... Судя по расходу сокетов - как то у вас нагрузка большая. Может так и получается, что deleteLater() отрабатывает с большим опозданием
Попробуйте отловить сигнал error, может что полезного выплюнет.
Разве QTCPServer имеет сигнал ошибки?
С обменом по QTCPSocket ошибок не возникает.
На клиенте (когда кончаются сокеты) при вызове connectToHost() обьект просто не переходит в состояние QAbstractSocket::ConnectingState, без ошибок.
Может быть вы удаляете некие объекты при помощи deleteLater()?
Удаляю просто delete, и закрываю явно.
Если верить статье http://xn--80ae9aggj.xn--p1ai/2009/01/19/tcp-time-wait/
то так и должно быть, сокеты действительно остаются с системе на некоторое время после закрытия соединения, и держат занятами порты.
Только тогда не ясно, как же пишут высоконагруженные серверы с тысячами коннектов в секунду...
В свое время много гуглил на эту тему. Но закладок не осталось....
Вот посмотри для затравки:
http://habrahabr.ru/post/108294/
http://www.prog.org.ru/topic_16415_0.html
Вот еще инетесную штуку нашел (суть и исходники на разных языках)
http://blog.virtan.com/2012/07/million-rps-battle.html
https://github.com/virtan/mrps
Спасибо! буду читать.