#include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { struct sockaddr_in addr; int fd, newFd, ret, fileFd, size = sizeof(addr); char buf[1024]; if(argc < 2) { fprintf(stderr, "uso: %s \n", argv[0]); exit(EXIT_FAILURE); } /** * AF_INET: dominio de la red * SOCK_STREAM: orientado a conexión */ fd = socket(AF_INET, SOCK_STREAM, 0); if(fd == -1) { perror("socket"); exit(EXIT_FAILURE); } addr.sin_family = AF_INET; addr.sin_port = htons(9000); /* 1 a 65535... pero 1 al 1024 solo para root */ addr.sin_addr.s_addr = INADDR_ANY; /* cualquier direc que tenga del servidor */ if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } if(listen(fd,10) == -1) { perror("listen"); exit(EXIT_FAILURE); } while(1) { if((newFd = accept(fd, (struct sockaddr *)&addr, &size)) == -1) { perror("listen"); exit(EXIT_FAILURE); } if((fileFd = open(argv[1], O_RDONLY)) < 0) { fprintf(stderr, "error abriendo el fichero origen: %s", argv[1]); exit(EXIT_FAILURE); } while( (ret=read(fileFd,buf,sizeof(buf))) > 0) { if( send(newFd, buf, ret, 0) == -1) { perror("send"); exit(EXIT_FAILURE); } } close(fileFd); close(newFd); } return 0; }