Exemplo n.º 1
0
void* reader_thread(void* limit) {
	for(int i=0;i<*(int*)limit;i++) {
		read_ready();
		randomize();
	}
	return 0;
}
Exemplo n.º 2
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);
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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();
    }
}
Exemplo n.º 5
0
void ClientSocket::setRaw(bool mode)
{
    bRawMode = mode;
    read_ready();
}
Exemplo n.º 6
0
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;
}