Работа с данными по нескольким TCP-соединениям с помощью epoll - PullRequest
1 голос
/ 03 марта 2010

У меня есть приложение, которое будет работать как p2p-программное обеспечение, где все одноранговые узлы будут общаться друг с другом. Поскольку связь будет осуществляться по протоколу TCP, я подумал, что могу использовать epool (4) , чтобы можно было обрабатывать несколько соединений. Поскольку каждый узел будет отправлять данные очень часто, я подумал, что я установлю постоянное соединение с каждым узлом, которое будет использоваться в течение срока службы приложений.

Теперь, одна вещь, которую я не знаю, как с этим справиться, это то, что, поскольку соединение никогда не закрывается, как мне узнать, когда я должен прекратить получать данные с помощью read() и снова вызвать epool_wait(), чтобы прослушивать больше пакетов? Или есть лучший способ справиться с постоянными соединениями TCP?

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

Вы должны установить сокет как неблокирующий, и когда epoll указывает, что есть данные для чтения Вы должны вызывать read () в цикле, пока read () не вернет -1 и значение errno не будет EWOULDBLOCK

То есть ваш цикл чтения может выглядеть примерно так:

for(;;)
  ssize_t ret;
  ret = read(...);
  if(ret == 0) {
     //client disconnected, handle it, remove the fd from the epoll set
      break;
  } else if(ret == -1) {
     if(errno == EWOULDBLOCK) {
        // no more data, return to epoll loop
      } else {
        //error occured, handle it remove the fd from the epoll set
      }
      break;
  }

 // handle the read data 
}

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

1 голос
/ 03 марта 2010

Это должен был быть «epoll», а не «epool» ... не знакомый с epoll, но взгляните здесь на руководство Beej , чтобы увидеть пример сокетов, использующих «poll». ... посмотрите в разделе 7.2, чтобы увидеть, как это делается, также посмотрите в разделе 9.17 для использования 'poll' ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 03 марта 2010

read () читает столько данных, сколько доступно сразу (но не больше того, что вы запрашиваете). Просто запустите read () на активном сокете с достаточно большим буфером (вам, вероятно, он не нужен больше, чем ваш MTU… 2048 байт), и вызовите epoll_wait () после его завершения.

...