Parte de um programa que envia um arquivo em blocos para outra maquina atraves de sockets. #define MAXSIZE 512 /* fname - arquivo a ser enviado */ if((fp = fopen(fname,"r+b")) == NULL) { printf("servidor: erro ao abrir o arquivo\n"); exit(0);} printf("servidor: iniciando transferência do arquivo\n"); fsize = 0; ack = 0; while ((c = getc(fp)) != EOF) {fsize++;} num_blks = fsize / MAXSIZE; /* num. blocos */ num_blks1 = htons(num_blks); num_last_blk = fsize % MAXSIZE; /* num. de blocos do ultimo byte */ num_last_blk1 = htons(num_last_blk); rewind(fp); printf("servidor: enviando"); for(i= 0; i < num_blks; i ++) { no_read = fread(out_buf,sizeof(char),MAXSIZE,fp); if (no_read == 0) {printf("servidor: erro de leitura\n");exit(0);} if (no_read != MAXSIZE) {printf("servidor: erro de leitura do arquivo\n");exit(0);} if((write(newsd,out_buf,MAXSIZE)) < 0) {printf("servidor: erro enviando bloco :%d\n",errno);exit(0);} if((read(newsd,(char *)&ack,sizeof(ack))) < 0) {printf("servidor: erro de leitura de ack :%d\n",errno);exit(0);} if (ntohs(ack) != ACK) { printf("servidor: ACK do bloco %d não recebido\n",i); exit(0); } printf("."); } if (num_last_blk > 0) { printf(".\n"); no_read = fread(out_buf,sizeof(char),num_last_blk,fp); if (no_read == 0) {printf("servidor: erro de leitura\n");exit(0);} if (no_read != num_last_blk) {printf("servidor: erro de leitura de arquivo\n");exit(0);} if((write(newsd,out_buf,num_last_blk)) < 0) {printf("servidor: erro ao transferir ultimo bloco: %d\n",errno);exit(0);} if((read(newsd,(char *)&ack,sizeof(ack))) < 0) {printf("servidor: erro de leitura de ack %d\n",errno);exit(0);} if (ntohs(ack) != ACK) { printf("servidor: ACK do último bloco não recebido\n"); exit(0); } } else printf("\n"); printf("servidor: TRANSFERENCIA COMPLETADA para o socket %d\n",newsd); fclose(fp); close(newsd);