Нет, это ограничение базовых сокетов C (и протокола TCP / IP в этом отношении). Мой вопрос к вам: почему вы закрываете их, когда вы можете создать свое приложение для их использования?
Проблема многих кратковременных сокетов состоит в том, что их отключение переводит их в состояние, в котором они не могут использоваться какое-то время (в основном, в два раза больше времени жизни пакетов, чтобы гарантировать, что любые пакеты в сети либо приходят, либо отбрасываются, или получить отказ от самой сети). В основном получается, что в 4-х кортежах, которые должны быть уникальными (исходный IP-адрес, исходный порт, целевой IP-адрес, целевой порт), первые и последние два имеют тенденцию всегда быть одинаковыми, поэтому при исчерпании источника порты, вы шланг.
Мы сталкивались с этой проблемой в программном обеспечении раньше, когда она стала очевидной только тогда, когда мы работали на более быстрых машинах (поскольку мы могли использовать гораздо больше сеансов).
Почему бы вам просто не открыть сокет и не продолжать его использовать? Похоже, что ваш протокол является простым запросом / ответом, который должен быть легко выполним при таком подходе.
Что-то вроде:
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((adr, prt)
for i in range(nb):
sck.send('question %i'%i)
answer=sck.recv(4096)
print 'answer %i : %s' % (%i, answer)
sck.close()
Обновление:
Одна из возможностей (и мы делали это раньше), если у вас заканчивается соединение из-за этого постоянного открытия / закрытия, - это обнаружить проблему и устранить ее. Рассмотрим следующий код (материал, который я добавил, является более псевдокодом, чем Python, так как я давно не касался Python):
for i in range(nb):
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((adr, prt)
while sck.error() == NO_SOCKETS_AVAIL:
sleep 250 milliseconds
sck.connect((adr, prt)
sck.send('question %i'%i)
sck.shutdown(SHUT_WR)
answer=sck.recv(4096)
print 'answer %i : %s' % (%i, answer)
sck.close()
По сути, он позволяет вам работать на полной скорости, когда есть много ресурсов, но замедляется, когда вы попадаете в проблемную область. Это на самом деле то, что мы сделали с нашим продуктом, чтобы «решить» проблему сбоев при недостатке ресурсов. Мы бы перестроили его, за исключением того факта, что это был устаревший продукт, срок службы которого приближался к концу, и мы в основном работали в режиме «исправить по минимальной цене».