开发者

Running a simple TCP server with poll(), how do I trigger events "artificially"?

I have a fairly basic TCP server keeping track of a couple connections and recv'ing data when it's available. However, I'd like to artificially trigger an event from within the program itself, so I can send my TCP server data as if it came from sock1 or sock2, but in reality came from somewhere else. Is this possible, or at all clear?

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
  }
}


Create a pair of connected sockets (see socketpair(2)), and wait for events on one of the sockets in your poll loop. When you want to wake up the poll thread, write a single byte to the other socket. When the polling loop wakes up, read the byte, do whatever was required and continue.


This is more like a design question -- your polling loop should probably abstract the poll method to allow trapping on other external signals, like from kill -USR1.

If you really want to trigger port traffic, you'll likely want to use netcat to send data to the socket.


I would consider something like this:

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. */
  }
}

Notes:

  • don't forget to initialise your events field
  • for(;;) is more idiomatic C than while(true) and doesn't require true to be defined
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜