Salve a tutti,
dovrei scrivere un programma client/server.Il client deve collegarsi a più server che trasferiranno al client il contenuto di una directory passata su riga di comando.Per fare questo ho pensato di collegarmi a tutti i server con socket (in modalità non bloccante) distinti e usare i/o multiplexing(tramite la funzione select).I problema nasce quando il client chiama la funzione connect infatti ottengo il seguente errore:connect() error: Operation now in progress.Al seguete sito della microsoft http://technet.microsoft.com/en-us/l.../cc956946.aspx c'è spiegato,se non ho capito male,che non ci può essere più di un socket in modalità non bloccante per processo/thread.Come risolvere?Vi saluto in attesa di un vostro aiuto.


codice:
#include <stdio.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include "/home/and/src1/c/prog_func.c"
#define MAX_BUFF 19

int main(int argc,char* argv[]){
	struct sockaddr_in serv_addr[100];
	int sock_fd[100],count=0,i,pid;
	struct address_port addr;
	char buff[MAX_BUFF];
	char info_buff[256];
	fd_set readfd;
	ssize_t nread;
	FILE *file_in;
	int max_fd=-1,
	    fd_sel;//numero di file selezionati
	int on=1,rc;

	if( (file_in=fopen(argv[1],"r")) == NULL){
		perror("fopen() error");
		exit(1);
	}
	FD_ZERO(&readfd);

	memset((void*)buff,0,MAX_BUFF*sizeof(char));
	memset((void*)sock_fd,-1,100*sizeof(int));

	while( (fgets(buff,MAX_BUFF,file_in)) != NULL){
		/*crea socket*/
		if( (sock_fd[count]=socket(AF_INET,SOCK_STREAM,0)) < 0){
			perror("socket() error");
			exit(1);
		}

	
	FD_SET(sock_fd[count],&readfd);
		//ogni socket in non-blocking mode
		 rc = ioctl(sock_fd[count], FIONBIO, (char *)&on);
		 if (rc < 0){
			 perror("ioctl() failed");
			 close(sock_fd[count]);
			 exit(-1);
		 }
         

		if( sock_fd[count] > max_fd)
			max_fd=sock_fd[count];
		separa_addr_port(buff,&addr);
		printf("addr:%s,port:%d\n",addr.addr,addr.port);//per debug
		memset((void*)&serv_addr[count],0,sizeof(serv_addr[count]));
		/*assegna indirizzo del server al socket*/
		serv_addr[count].sin_family=AF_INET;
		serv_addr[count].sin_port=htons(addr.port);
		if( inet_pton(AF_INET,addr.addr,(void*)&serv_addr[count].sin_addr) <= 0 ){
			perror("inet_pton() error");
			exit(1);
		}
		memset((void*)buff,0,MAX_BUFF*sizeof(char));
		count++;
	}
	if( ferror(file_in) ){
		perror("fegets() error");
		exit(1);
	}
	printf("numero di server:%d\n",count);

	/*connetti client al server*/
	for(i=0;i<count;i++){
		if( (connect(sock_fd[i],(struct sockaddr*)&serv_addr[i],sizeof(serv_addr[i]))) < 0){
			printf("errno:%d\n",errno);

			perror("connect() error");
			exit(1);
		}
	}

	while(1){
		//seleziono fd pronti
		while( ((fd_sel=select(max_fd+1,&readfd,NULL,NULL,NULL)) < 0) && (errno=EINTR) )
				;
		printf("numero di fd nel set:%d\n",fd_sel);
		for(i=0;i<fd_sel;fd_sel++){
			if( FD_ISSET(sock_fd[i],&readfd)){
				printf("sock_fd %d\n",sock_fd[i]);
				while( (nread=read(sock_fd[i],buff,256)) > 0){
					buff[nread]='\0';
					fprintf(stdout,"%s\n",buff);
				}
				if( nread < 0)
					perror("read() error");
				if( nread == 0){
					close(sock_fd[i]);
					FD_CLR(sock_fd[i],&readfd);
				}
			}
			else
				printf("file non nel set\n");


		}
		
	}
}