void* writer_thread(void* limit) { for(int i=0;i<*(int*)limit;i++) { write_ready(); randomize(); } return 0; }
void SerialPort::timeout() { if (d->m_state == Setup){ if (!SetupComm(d->hPort, 1024, 1024)){ log(L_WARN, "SetupComm error"); close(); emit error(); return; } PurgeComm(d->hPort, PURGE_RXABORT | PURGE_RXCLEAR); d->m_state = None; emit write_ready(); return; } if (!EscapeCommFunction(d->hPort, SETDTR)){ log(L_WARN, "Set DTR error"); close(); emit error(); return; } DCB dcb; memset(&dcb, 0, sizeof(dcb)); dcb.DCBlength = sizeof(dcb); if (GetCommState(d->hPort, &dcb) == 0){ log(L_WARN, "Get status error"); close(); emit error(); return; } dcb.fBinary = TRUE; dcb.BaudRate = d->m_baudrate; dcb.fParity = FALSE; dcb.Parity = 0; dcb.ByteSize = 8; dcb.StopBits = 0; if (!d->m_bXonXoff) { dcb.fInX = FALSE; dcb.fOutX = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fOutxCtsFlow = FALSE; } else { dcb.fInX = TRUE; dcb.fOutX = TRUE; dcb.fOutxDsrFlow = FALSE; dcb.fOutxCtsFlow = FALSE; } dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fRtsControl = RTS_CONTROL_ENABLE; if (SetCommState(d->hPort, &dcb) == 0){ log(L_WARN, "Set status error"); close(); emit error(); return; } d->m_state = Setup; d->m_timer->start(d->m_time, true); }
void SerialPort::timeout() { if (d->m_state == Setup){ tcflush(d->fd, TCIFLUSH); d->m_state = None; d->m_notify = new QSocketNotifier(d->fd, QSocketNotifier::Read, this); connect(d->m_notify, SIGNAL(activated(int)), this, SLOT(readReady(int))); emit write_ready(); return; }
vector<char> Node::Read(bool& did_read) { //If node is being written to tell didRead and return nothing. if (is_end() && write_ready()) { did_read = false; return{}; } vector<char> v(value_.begin(), value_.end()); write_ready_ = true; did_read = true; //Let's not rely on the user initilizing the variable. return v; }
void ICQClient::sendPacket() { char *packet = writeBuffer.Data(m_nPacketStart); *((unsigned short*)(packet + 4)) = htons(writeBuffer.size() - m_nPacketStart - 6); dumpPacket(writeBuffer, m_nPacketStart, "Write"); time(&m_lastTime); if ((m_fd == -1) || (m_connecting != Connected)) return; fd_set wf; FD_ZERO(&wf); FD_SET(m_fd, &wf); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; int res = select(m_fd + 1, NULL, &wf, NULL, &tv); if (res <= 0) return; if (!FD_ISSET(m_fd, &wf)) return; write_ready(); }
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; }
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; }