#include #include #include #include #include #include #include #include #include #define MAXFDS 32 int c = 0; struct fd_info_t { int fd; void (*handler)(int); } fd_info[MAXFDS]; int open_connection(char *address, int port) { int d; struct sockaddr_in sa; d = socket(AF_INET, SOCK_STREAM, 0); sa.sin_family = AF_INET; sa.sin_port = htons(port); inet_aton(address, &sa.sin_addr); return (connect(d, (const struct sockaddr *)&sa, sizeof(sa)) == 0) ? d : -1; } void add_handler(int fd, void (*h_f)(int)) { if (c != MAXFDS && fd != -1) { fcntl(fd, F_SETFL, O_ASYNC); fcntl(fd, F_SETOWN, getpid()); fd_info[c].fd = fd; fd_info[c].handler = h_f; c++; } } void manage(int n) { int i, l; fd_set readfds; FD_ZERO(&readfds); for (i=0,l=0; i l) ? fd_info[i].fd : l) FD_SET(fd_info[i].fd, &readfds); select(l+1, &readfds, 0, 0, 0); for (i=0; i