for(i = 0; i <= fdmax; i++) { if (FD_ISSET(i, &read_fds)) { / FILE *fp; if (i == listener) { //handle new connections addrlen = sizeof remoteaddr; if ((newfd = accept(listener, (struct sockaddr *)&remoteaddr, &addrlen)) == -1) { perror("accept"); } else { FD_SET(newfd, &master); //add to master set if (newfd > fdmax) { //keep track of the maximum fdmax = newfd; } } } else { //handle data from a client if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) { //got error or connection closed by client if (nbytes == 0) { //connection closed printf("selectserver: socket %d hung up\n", i); } else { perror("recv"); } close(fp); close(i); //bye! FD_CLR(i, &master); //remove from master set } else { //how can i free the memory and remove the part i fwrite ? fwrite(buf,sizeof(buf),1, fp) ; } } } }