/***************************************************************************** * Módulo: Shell UDP - Servidor *****************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define MSG_LEN 2048 int main(int argc, char *argv[]) { int sock; // handler del socket struct sockaddr_in h_addr; // ip servidor struct sockaddr_in c_addr; // ip cliente int bytes; // numero de bytes enviados char msg[MSG_LEN]; int size_addr; char rsp2[MSG_LEN]; FILE *pipe_cmd; if (argc != 2) { fprintf(stderr, "usage: shell-udp-srv port\n"); exit (EXIT_FAILURE); } printf ("Servidor UDP escuchando en el puerto %s\n\n",argv[1]); if ((sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) { perror( "\nNo se ha podido crear el socket!\n"); exit (EXIT_FAILURE); } h_addr.sin_family = AF_INET; h_addr.sin_port = htons(atoi(argv[1])); h_addr.sin_addr.s_addr=INADDR_ANY; // Nuestra ip memset(&(h_addr.sin_zero), '\0', 8); if(bind(sock,(struct sockaddr *)&h_addr,sizeof(struct sockaddr))==-1) { perror("\nError asociando el puerto!\n"); exit(EXIT_FAILURE); } size_addr= sizeof(struct sockaddr); while(1){ memset (msg,'\0',MSG_LEN); memset (rsp2,'\0',MSG_LEN); if ((bytes=recvfrom(sock,msg,MSG_LEN-1,0, (struct sockaddr *)&c_addr,&size_addr))==-1) { perror("\nError recibiendo el mensaje!\n"); exit(EXIT_FAILURE); } /* Ejecutamos el comando en el sistema */ if ((pipe_cmd=popen(msg,"r"))<0) { printf("Error abriendo pipe"); exit(EXIT_FAILURE); } /* Leemos del pipe la respuesta del sistema y la almacenamos en rsp2 */ if ((fread(rsp2,MSG_LEN,1,pipe_cmd))<0) { perror("\nError leyendo el mensaje!\n"); exit(EXIT_FAILURE); } /* Enviamos rsp2 al cliente */ if ((bytes=sendto(sock, rsp2, strlen(rsp2), 0, (struct sockaddr *)&c_addr, sizeof(struct sockaddr)))==-1) { perror("No se ha podido enviar el mensaje!"); } fflush(pipe_cmd); } close(sock); return 0; }
|
0 comentarios:
Publicar un comentario