2013-07-14 3 views
0

Я пытаюсь реализовать TCP-сервер, который не будет вешать (потенциально) навсегда во время операции recv или sendall.Внедрение неблокирующего сервера TCP

Я думал, что это будет достаточно, чтобы задать тайм-аут для активного сокета, но это, кажется, не так: see here

Итак, как я мог бы расширить свой код, чтобы убедиться, что:

  • RECV не будет висеть в любом случае
  • SendAll не будет висеть в любом случае (ну, я не уверен, что если SendAll может повесить на всех)

Любые предложения приветствуются.

+0

Посмотрите [скрученной] (http://twistedmatrix.com/trac/) – User

ответ

1

Что вам нужно, это функция select. Требуется 3 аргумента; список чтения, список записи, список ошибок. И затем он возвращает три значения, каждый из которых является списком сокета, который вы ввели, которые готовы либо быть записаны, либо прочитаны. (Или была ошибка, если вы хотите, чтобы проверить это.)

rl , wl , el = select([ serversocket , clientsocket ] , [] , []); 
for e in rl: 
    if e == serversocket: 
    acceptConnection(serversocket); 
    else: 
    readFromClient(clientsocket); 
+0

Привет! Спасибо, что ответили. Означает ли это это также то, что sendall не будет вешать трубку? Не нужно ли блокировать активный сокет? – Rickson

+0

Вы хотите перейти в неблокирующий режим для 'sendall', но прежде чем писать в следующий раз, убедитесь, что вы можете написать ему еще с' select'. – NullData

+0

Вам не нужно делать разблокировку сокета. Select указывает zou, если что-то есть, а затем вы можете начать читать/писать. – User

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