Ciao a tutti,
Sto provando ad utilizzare una libreria trovata su internet per la comunicazione di rete con socket, implementando una comunicazione client-server.
Nel client una volta effettuata la connect() gira un ciclo for che esegue 10 iterazioni, in ogni iterazione invia un messaggio al server ed attende una risposta.
Il server con una select rimane in attesa di connessioni, una volta ricevuto il messaggio del client invia una risposta.
Alla prima iterazione tutto ok, alla seconda il server mi dà un errore di tipo bad file descriptor appena rientra nella select, non riesco a venirne a capo, qualcuno può aiutarmi? Grazie!
Posto il codice del server:

codice:
#include <iostream>
#include "usock.h"
#include "usock_exception.h"

#include <string.h>


using namespace std;
using namespace usock;



int main()  {
	printf("Executing program prova_select\n");
	int val=1;
	char send_buffer[BUFRECV_SIZE];
	char recv_buffer[BUFRECV_SIZE];

	int max_sd, new_sd;
        int clients[10];
        int client_index=-1;

	fd_set readset,tempset;

	struct sockaddr_in addr;
	socklen_t len = sizeof(struct sockaddr);


	try {
		ServerSocket ss(9999);

		printf("Server: listening on port %d\n", ss.localPort());

		try{
			ss.setSockOpt(SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
		}
		catch (exception e) {
			printf("Reuse address exception");
			exit(-1);
		}

		max_sd = ss.getSd();

		for (int ind = 0; ind < 10; ind++) {
			clients[i]=-1;
		}

		FD_ZERO(&readset); 		//Resetto l'insieme dei descrittori per la lettura
		FD_SET(ss.getSd(), &readset);	//Setto il bit corrispondente al socket in ascolto nell'insieme dei descrittori per la lettura

		while(1) {

			tempset = readset;
			if (select(max_sd+1, &tempset, NULL, NULL, NULL) < 0) {
				perror("select()");
				throw SocketException("Server: select error");
			}

			if (FD_ISSET(ss.getSd(), &tempset)) {
				try {
					int new_sd=accept(ss.getSd(), (struct sockaddr*)&addr, &len);
					printf("Server: Accepted new connection on socket %d\n", new_sd);


					for (int i = 0; i < ss.getMaxconn(); i++) {
						if (-1 == clients[i]) {
							clients[i]=new_sd;

							//aggiorna massimo indice in array di connessioni aperte
							if (i > client_index) {
								client_index=i;

							}
							FD_SET(new_sd, &readset);

							//Aggiorno indice del massimo descrittore per la select
							if (new_sd > max_sd) {
								max_sd=new_sd;
							}
							break;
						}
					}
				}
				catch (exception e) {
					printf("Server: accept() failed\n");
				}
			}

			else {
				for (int i=0; i <= 10; i++) {
					int temp_sd=clients[i];

					if (-1 == temp_sd) {
						printf("Server: Socket %d already closed\n", temp_sd);
						continue;
					}

					//Controllo se sono stati ricevuti dati sul socket corrente
					if ( FD_ISSET(temp_sd, &tempset) ) {


						try {
							Socket temp_sock(temp_sd);
						//Controllo il numero dei bytes ricevuti. Se è pari a zero la connessione lato client è stata chiusa. Rimuovo il descrittore dall'array delle connessioni aperte
							if ( temp_sock.recv(recv_buffer, sizeof(recv_buffer)) == 0 ) {

								printf("Server: Socket %d closed.\n", temp_sd);
								temp_sock.close();
								FD_CLR(temp_sd, &readset);
								clients[i]=-1;
							}

							else {

								printf("Server: Received data %s from socket %d\n", recv_buffer, temp_sd);
								strcpy(send_buffer, recv_buffer);

								try {

									temp_sock.send(send_buffer, sizeof(send_buffer));

								}
								catch (exception e) {
									printf("Send failed");

								}

							}

						}
						catch (exception e) {
							printf("Receive failed\n");
						}
					}
				}
			}





		}

		ss.close();
	}
	catch (exception e) {
		exit(-1);
	}
}



[