FD_ZERO(&sockUp); FD_SET(sd, &sockUp); FD_SET(fd, &sockUp); if(sd > max) max = sd; if(fd > max) max = fd; logger("Now accepting connections"); while (1) { sockUpUse = sockUp; select(max + 1, &sockUpUse, NULL, NULL, NULL); if (FD_ISSET(sd, &sockUpUse)) { socklen_t addrlen = sizeof(clientInfo); // Prijimam nove spojeni int client = accept(sd, (sockaddr*)&clientInfo, &addrlen); logger("Connection accepted from %s", inet_ntoa(clientInfo.sin_addr)); socklist.push_back(client); } int slen = 0; unsigned char sbuff[BUFSIZE]; int slenght = 0; if(FD_ISSET(fd, &sockUpUse)) { if((slenght = read( fd, sbuff, BUFSIZE)) <= 0) usleep(100); else { for(std::vector::iterator i = socklist.begin(); i != socklist.end(); i++) slen = send((* i), sbuff, slenght, 0); logger("Data received correctly, %d bytes sent to network", slen); } } slen = 0; for(std::vector::iterator i = socklist.begin(); i != socklist.end(); i++) { if (FD_ISSET(*i, &sockUpUse)) { unsigned char buffer[BUFSIZE]; int lenght; if ((lenght = recv(*i, (void *)buffer, BUFSIZE, 0)) <= 0) { // Prijato 0 bytu - druha strana uzavrela spojeni socklen_t addrlen = sizeof(clientInfo); getpeername((*i), (sockaddr*)&clientInfo, &addrlen); close(*i); logger("Connection closed for %s", inet_ntoa(clientInfo.sin_addr)); socklist.erase(i); // Ukoncim cyklus. Neni dobre pokracovat v prochazeni kontejneru, kdyz jsem vymazal prvek. break; } else { for(std::vector::iterator j = socklist.begin(); j != socklist.end(); j++) { if (*i != *j) slen = send((* j), buffer, lenght, 0); } if(slen == 0) logger("Data received correctly, but no more clients connected"); else logger("Data received correctly, %d bytes sent to network", slen); slen = write(fd, &buffer, lenght); logger("Data received correctly, %d bytes sent to serial device", slen); } } } FD_ZERO(&sockUp); FD_SET(sd, &sockUp); FD_SET(fd, &sockUp); max = 0; if(sd > max) max = sd; if(fd > max) max = fd; for(std::vector::iterator i = socklist.begin(); i != socklist.end(); i++) { if (*i > max) { max = *i; } FD_SET(*i, &sockUp); } if (max < sd) { max = sd; } } close(sd); close(fd); for_each(socklist.begin(), socklist.end(), close); logger("Server closed");