/** Servidor de archivos binarios **/ #include #include #include #include #include #include #include int main(int argc, char* argv[]) { int s_listen_id; int s_client_id; struct sockaddr_in direccion; struct hostent host; char buffer[255]; int fd; int r; ssize_t leido; socklen_t tamDir; int puerto; if (argc == 1) { puerto = 4242; } else { puerto = atoi(argv[1]); } printf("Usando puerto %i.\n", puerto); // 2. Creamos el socket de escucha printf("Creando socket escucha...\n"); s_listen_id = socket(AF_INET, SOCK_STREAM, 0); if (s_listen_id == -1) { perror("Error creando socket de escucha."); return -1; } // 3. Construimos la dirección de escucha direccion.sin_family = AF_INET; direccion.sin_port = htons(puerto); direccion.sin_addr.s_addr = INADDR_ANY; // 4. Vincluamos la direccion al socket printf("Vinculando dirección de escucha...\n"); r = bind(s_listen_id, &direccion, sizeof(direccion)); if (r == -1) { perror("Error en la vinclulación."); return -1; } // 5. Creamos la cola de escuchas r = listen(s_listen_id, 10); if (r == -1) { perror("Error creando la cola de escucha."); return -1; } // 6. Esperamos conexiones. // Podemos salir de este bucle !!! tamDir = sizeof(struct sockaddr_in); while(1) { printf("Esperando conexión....\n"); s_client_id = accept(s_listen_id, &direccion, &tamDir); if (s_client_id == -1) { perror("Error aceptando conexión."); break; } printf("Conexión aceptada.\n"); // 1. intentamos abrir el archivo printf("Abriendo archivo...\n"); fd = open("./fBin", O_RDONLY); if (fd == -1) { perror("Error abriendo fichero."); break; } // Leemos y enviamos el archivo do { leido = read(fd, &buffer, 255); r = 0; if (leido > -1) r = send(s_client_id, buffer, leido, 0); if (r == -1) { perror("Error enviando archivo."); break; } } while (leido > 0); if (leido == -1) { perror("Error leyendo el archivo."); break; } close(fd); close(s_client_id); printf("Fin del envio. bytes finales (%i)...\n", leido); } // Aquí puede llegar close (s_listen_id); close(fd); printf("Ok.\n"); }