/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

CLIENTE UDP

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
gancedin



Registrado: 08 Ene 2010
Mensajes: 12

MensajePublicado: 08/01/2010 4:35 am
Título: CLIENTE UDP

Hola a todos,
Tengo que programar un cliente bajo el protocolo UDP, que se conecte a un servidor de ECHO que ya tengo programado, pero ha de invocarse desde la línea de comandos de la forma siguiente:

$ ./cliente-echo-udp gollum 47893

gollum es el servidor de clase, y 47893 es el puerto que pide el enunciado.

Si alguien puede echarme un cable...

1000 gracias
Volver arriba
Sorancio



Registrado: 29 May 2009
Mensajes: 1157
Ubicación: España

MensajePublicado: 08/01/2010 5:15 am
Título:

¿Y dónde se supone que tienes el problema? ¿Programas en C o C++?
Imagino que el problema debe ser recibir los parámetros de inicio del programa, así que... lo primero, la definición de main debe ser la siguiente:

Código:
int main(int, char **)


Los parámetros pueden tener el nombre que quieras.

El primer parámetro es un entero que tiene asignado la cantidad de parámetros que ha recibido el programa, siempre es mayor o igual a 1, porque al programa siempre se le pasa cómo parámetro su ruta.
El segundo parámetro es una matriz de cadenas de caracteres que tiene el valor de todos los parámetros pasados, la longitud de la matriz es de igual al valor del primer parámetro, y el primer elemento de la matriz es la ruta donde está el programa al ejecutarse.
Volver arriba
gancedin



Registrado: 08 Ene 2010
Mensajes: 12

MensajePublicado: 08/01/2010 11:31 am
Título:

Hola de nuevo, quizá expresé incompleto el problema.
Tengo que realizar el cliente UDP y para ello se requiere:
Para crear el socket, utilizar una función ya presente en el servidor, esa parte ya estaría implementada.
A continuación entrar en un bucle que repita lo siguiente:
Imprimir en pantalla un “prompt”, por ejemplo “->”, y leer lo que escriba el usuario.
Si el texto que se ha leido es "FIN", termina.
Si no, envía lo que el usuario ha escrito al servidor, usando la función sendto(). Se necesita proporcionar a esta función una IP y un número de puerto. Usar los de la máquina en la que esté funcionando tu servidor.
Esperar a que el servidor te envíe una respuesta, usando la función recvfrom().
Imprimir en pantalla esta respuesta, usando printf(" %s").

grasias
Volver arriba
Sorancio



Registrado: 29 May 2009
Mensajes: 1157
Ubicación: España

MensajePublicado: 08/01/2010 12:04 pm
Título:

Sigo sin saber dónde tienes el problema, sólo me has dicho que ejercicio has de hacer y que tienes implementado, pero no me has dicho que errores da lo que falta.

El bucle no será algo difícil:

Código:
do {
   char entrada[81];
   printf("$> ");
   fflush(stdout);
   if (scanf("%[^\n]", entrada) != 1){ /** hasta el fin de linea **/
      continue;
   }
    // analizar enviar comando
} while(strncmp(entrada, "FIN", 3) != 0);
Volver arriba
gancedin



Registrado: 08 Ene 2010
Mensajes: 12

MensajePublicado: 19/01/2010 4:02 am
Título:

Hola, esto es lo que tengo hecho hasta ahora:

#include <sys/socket.h> // socket, send, recv. . .
#include <netinet/in.h> // sockaddr in, htons, htonl, etc.
#include <arpa/inet.h> // inet addr
#include <unistd.h> // close
#include <stdlib.h> // exit
#include <stdio.h> // printf, fprintf. . .
#include <errno.h> // errno
#include <string.h>
#include <sys/types.h>


#define PUERTO 47893
#define TAM_RECIBE 75
#define TAM_ENVIA 75
#define MAX_LINEA 80


int InicializarSocketUDP(int puerto);

void EnviaryRecibir(int socket_udp, char entrada[]);

int main(int argc, char *argv[])
{
int socketUDP;

// Informar al usuario del número de puerto que se usará
//printf("Servidor UDP: usando el puerto por defecto = % d\n", PUERTO);


if (argc!=2){
printf ("Error: no se ha especificado el numero de puerto ej:./echo-rev 8790\n");
return 0;
}


// Eliminar el buffer de printf, para que los printfs tengan efecto
// inmediato y sea más fácil depurar el programa
// setvbuf(stdout, NULL, _IONBF, 0);


socketUDP=InicializarSocketUDP(PUERTO);

while (1) {
char entrada[200];
char *fin="FIN";
printf("-> ");
fgets(entrada, 199, stdin);
printf("Has escrito: %s\n", entrada);

if (strcmp(entrada,fin)==0)
break;
else
EnviaryRecibir(socketUDP, entrada);
}
}


int InicializarSocketUDP(int puerto)
{
int ret;
struct sockaddr_in dir;
int socket_UDP;

// Crear el socket
socket_UDP=socket(PF_INET, SOCK_DGRAM, 0); // DGRAM
if (socket_UDP==-1) {
perror("Al crear socket");
exit(-1);
}
// Asignarle el numero de puerto
dir.sin_family=AF_INET;
dir.sin_port=htons(puerto);
dir.sin_addr.s_addr=htonl(INADDR_ANY);
//ret=bind(socket_UDP,(struct sockaddr *) &dir, sizeof(dir));
if (ret==-1) {
perror("Al asignar direccion");
close(socket_UDP);
exit(-1);
}
// NO SE HACE listen()
// El socket ya está preparado para recibir
return socket_UDP;
Código:
Código:
[u][b][quote][/quote][/b][/u]
Código:
[color=green][/color]

Con esto, me da un fallo de conexión: error 10061

También tengo que añadirle la estructura gethostbyname(), pero por el momento eso no sé como hacerlo
Volver arriba
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com