2017-01-11 3 views
3

Я создаю приложение для простого чата в python, используя программирование сокетов, и мне нужно, чтобы мой сокет принимал неограниченное количество подключений, в отличие от этого «socket.listen (100)», которое ограничено 100. Пожалуйста, объясните мне, что я должен делать, чтобы обрабатывать большое количество соединений?Принимать неограниченные соединения с сокетом

+0

У вас есть неограниченный трафик для ваших неограниченных соединений? –

+0

Да, у меня есть VPS с неограниченной пропускной способностью. – Matarata

+1

Параметр '' socket.listen' '- это максимальное количество ожидающих соединений, которые еще не были '' accept''. Он не ограничивает количество установленных соединений. – jasonharper

ответ

3

Числа дано с listen() является размером отставания очереди - это намека количеству ожидающих запросов, а не количество активных запросов.

Вы часто увидите значение 5, используемое для backlog параметр - это исторический. Ранние версии сокетов Berkeley имели «функцию», где любое значение, большее 5, просто дало 5. Так было 5. Это было зафиксировано давно, но это еще не номер, о котором вам нужно слишком беспокоиться - помните, что это только намек.

Если отставание превышено, фактическая ошибка, выдаваемая клиенту, обычно является уловкой ECONNREFUSED, но для более старых систем используется определенная ошибка с отставанием.

На многих системах отставание молча усечено до SOMAXCONN.

Смотрите также listen() ignores the backlog argument?

1

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

Нить на соединение, которое читается с длинным таймаутом, независимо от того, что вы хотите, чтобы ваш тайм-аут ожидания сессии был. Если истечет время ожидания, вы закрываете сокет и выходите из потока.

Если на сервере не хватает FD, что произойдет, если будет достаточно одновременных соединений, accept() начнет сбой с соответствующей ошибкой: в этом случае вы просто проигнорируете его и продолжаете цикл. Возможно, вы уменьшите тайм-аут простоя в этой ситуации и вернете его, когда принимаете снова начать работу.

Вы плохо относитесь к проблеме. С сокетами на стороне сервера вы принимаете подключения к одному и тому же сокету, которые затем обрабатываются другими процессами/потоками.

# 
# Setup socket and other handling stuff here 
# 

while True: 
    conn = sock.accept() 
    thread.start_new_thread(handler, (conn,)) 

Будет установлено практическое ограничение на максимальное количество сокетов на основе памяти вашей системы.

См. http://docs.python.org/2/library/socketserver.html. Я думаю, что последние несколько примеров (под Asynchronous Mixins) очень близки к тому, чего вы хотите достичь.

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