void* reader_thread(void* limit) { for(int i=0;i<*(int*)limit;i++) { read_ready(); randomize(); } return 0; }
static void def_read (lw_stream _ctx, size_t bytes) { lw_fdstream ctx = (lw_fdstream) _ctx; lwp_trace ("FDStream %p (FD %d) read " lwp_fmt_size, ctx, ctx->fd, bytes); lw_bool was_reading = ctx->reading_size != 0; if (bytes == -1) ctx->reading_size = lw_stream_bytes_left ((lw_stream) ctx); else ctx->reading_size += bytes; if (!was_reading) read_ready (ctx); }
bool SerialPort::event(QEvent *e) { if (e->type() != QEvent::User) return QObject::event(e); switch (static_cast<SerialEvent*>(e)->reason()){ case EventComplete:{ DWORD bytes; if (GetOverlappedResult(d->hPort, &d->over, &bytes, true)){ if (d->m_state == Read){ d->m_buff.pack(&d->m_char, 1); if (d->m_char == '\n') emit read_ready(); } if (d->m_state == Write){ emit write_ready(); d->m_state = Read; } if (d->m_state == Read){ d->m_state = StartRead; SetEvent(d->hEvent); } break; } close(); emit error(); break; } case EventTimeout:{ log(L_WARN, "IO timeout"); CancelIo(d->hPort); close(); emit error(); break; } case EventError:{ log(L_WARN, "IO error"); close(); emit error(); } } return true; }
void SerialPort::readReady(int) { d->m_readTimer->stop(); for (;;){ char c; int res = read(d->fd, &c, 1); if ((res < 0) && (errno == EAGAIN)) return; if (res <= 0){ log(L_DEBUG, "Read serial error: %s", (res < 0) ? strerror(errno) : "connection closed"); close(); emit error(); return; } d->m_readTimer->start(d->m_timeout, true); d->m_buf.pack(&c, 1); if (c == '\n') emit read_ready(); } }
void ClientSocket::setRaw(bool mode) { bRawMode = mode; read_ready(); }
int main(int argc, char *argv[]) { int listenfd; struct sockaddr_in serv_addr; listenfd = socket(AF_INET, SOCK_STREAM, 0); if (listenfd < 0) { printf("Unable to open socket: %d (%s)\n", errno, strerror(errno)); return 1; } serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(60002); if (bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("Unable to bind address: %d (%s)\n", errno, strerror(errno)); return 1; } listen(listenfd,5); if (fork()) exit(0); setsid(); if (fork()) exit(0); std::vector<Client> clients; while (true) { fd_set rfds, wfds; FD_ZERO(&rfds); FD_ZERO(&wfds); int maxfd = 0; if (clients.size() < MAX_CLIENTS) { FD_SET(listenfd, &rfds); maxfd = listenfd; } for (auto it = clients.begin(), eit = clients.end(); it != eit; ++it) { if (it->write_ready()) { FD_SET(it->fd, &wfds); if (maxfd < it->fd) maxfd = it->fd; } if (it->read_ready()) { FD_SET(it->fd, &rfds); if (maxfd < it->fd) maxfd = it->fd; } } if (select(maxfd+1, &rfds, &wfds, NULL, NULL) < 0) { if (errno == EINTR) continue; syslog(LOG_ERR, "Error in select(): %m"); break; } // Process any existing connections. for (auto it = clients.begin(), eit = clients.end(); it != eit; ++it) { if (FD_ISSET(it->fd, &rfds) || FD_ISSET(it->fd, &wfds)) it->run_io(); } // Accept New Connections if (FD_ISSET(listenfd, &rfds)) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int clientfd = accept(listenfd, reinterpret_cast<struct sockaddr*>(&client_addr), &client_addr_len); #ifdef IP_ACL_FILE if (authorize_ip(ntohl(client_addr.sin_addr.s_addr))) { #endif clients.emplace_back(clientfd); #ifdef IP_ACL_FILE } else { close(clientfd); char ipaddr[16]; ip2string(ntohl(client_addr.sin_addr.s_addr), ipaddr, 16); syslog(LOG_NOTICE, "Connection attempted from unauthorized IP: %s", ipaddr); } #endif } } return 1; }