Запуск простого TCP-сервера с poll (), как я могу вызвать события «искусственно»? - PullRequest
1 голос
/ 30 октября 2009

У меня довольно простой TCP-сервер, который отслеживает пару подключений и получает данные, когда они доступны. Тем не менее, я хотел бы искусственно вызвать событие из самой программы, поэтому я могу отправить данные моего TCP-сервера , как если бы они были получены из sock1 или sock2, но в действительности пришли из другого места. Это возможно или вообще ясно?

struct pollfd fds[2];
fds[0].fd = sock1;
fds[1].fd = sock2;

while (true) {
  int res = poll(fds, 2, timeout);

  if ((fds[0].revents & POLLIN)){
    //ready to recv data from sock1
  }
  if ((fds[1].revents & POLLIN)){
    //ready to recv data from sock2
  }
}

Ответы [ 3 ]

4 голосов
/ 30 октября 2009

Создайте пару подключенных сокетов (см. Socketpair (2)) и ждите событий на одном из сокетов в вашем цикле опроса. Если вы хотите активировать поток опроса, запишите один байт в другой сокет. Когда цикл опроса проснется, прочитайте байт, сделайте все, что требовалось, и продолжайте.

0 голосов
/ 30 октября 2009

Я бы рассмотрел что-то вроде этого:

struct pollfd fds[2];
fds[0].fd = sock1;
fds[0].events = POLLIN;
fds[1].fd = sock2;
fds[1].events = POLLIN;

for (;;) {
  int result = poll(fds, 2, timeout);

  if (result) {
    if ((fds[0].revents & POLLIN)){
      /* Process data from sock1. */
    }
    if ((fds[1].revents & POLLIN)){
      /* Process data from sock2. */
    }
  } else {
    /* Do anything else you like, including
       processing data that wasn't from a
       real socket. */
  }
}

Примечания:

  • не забудьте инициализировать ваше events поле
  • for(;;) более идиоматический C, чем while(true) и не требует true для определения
0 голосов
/ 30 октября 2009

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

Если вы действительно хотите инициировать трафик порта, вы, вероятно, захотите использовать netcat для отправки данных в сокет.

...