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");
}
}
}