SOCKETS - Linux :: Shell UDP - Servidor

/*****************************************************************************
* 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;

}


Posted on 3:13 p. m. by skarvin and filed under | 0 Comments »

0 comentarios: