| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
visualfree
Registrado: 05 Dic 2008 Mensajes: 1
| Publicado: 05/12/2008 1:29 pm | | | Título: Ayuda con cidigo socket porfavor... |
| Tengo el cliente y el servidor , el cliente envia un mensaje al servidor y el servidor repite el mensaje al cliente , lo que yo necesito de este mismo codigo es que si el cliente envia la palabra "la" el servidor escriba printf("Se recivio LA"); si el cliente envia la palabra "le" el servdor escriba printf("Se recivio LE); , eso es lo unico que necesito pero hasta ahora no lo logro , les copio el codigo aca haber si alguien me puede dar una mano desde ya muchas gracias y saludos.....
CODIGO SERVIDOR:
| Código: | #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MAX_CONN 10 //Nº máximo de conexiones en espera /**********************************************************/ /* función MAIN */ /* Orden Parametros: Puerto */ /* */ /**********************************************************/ main(int argc, char *argv[]) { int s,s_aux; struct sockaddr_in bs,in, out_s; char entrada[255]; int sd; int r=2; if (argc == 2) { // Creamos el socket s = socket(AF_INET, SOCK_STREAM,0); if (s != -1) { bs.sin_family = AF_INET; bs.sin_port = htons(atoi(argv[1])); bs.sin_addr.s_addr = htonl(INADDR_ANY); //Asigna un nombre local al socket if( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1) { //printf("\n\aServidor ACTIVO escuchando en el puerto: %s\n",argv[1]); //Espera al establecimiento de alguna conexión listen(s, MAX_CONN); //Permite atender a múltiples usuarios while (1) { //Establece una conexión s_aux = accept (s,(struct sockaddr*) &in, &sd); //Recibe el mensaje del cliente if ( recv(s_aux,entrada, sizeof(entrada) ,0)== -1) { perror("Error en recvfrom"); } //Envia el mensaje al cliente if (send(s_aux,strcat(entrada,"\0"),strlen(entrada)+1,0) == -1) { perror("Error en sendto"); //Cierra la conexión con el cliente actual close(s_aux); } } //Cierra el servidor close(s); } else { printf("ERROR al nombrar el socket\n"); } } else { printf("ERROR: El socket no se ha creado correctamente!\n"); } } else { printf("\n\n\aEl número de parámetros es incorrecto\n\n"); } }
|
CODIGO CLIENTE:
| Código: | #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> /**********************************************************/ /* función MAIN */ /* Orden Parametros: IP destino, puerto , mensaje */ /* */ /**********************************************************/ main(int argc, char *argv[]) { int s; struct sockaddr_in bs,des; char resp[255]; int *sd; if (argc == 4) { // Creamos el socket s = socket(AF_INET,SOCK_STREAM,0); if (s != -1) { bs.sin_family = AF_INET; bs.sin_port = htons(0); //Asigna un puerto disponible dela máquina bs.sin_addr.s_addr = htonl(INADDR_ANY); //Asigna una IP de la máquina //Asigna un nombre local al socket if( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1) { //Se prepara el nombre de la máquina remota des.sin_family = AF_INET; des.sin_addr.s_addr = inet_addr(argv[1]); des.sin_port = htons(atoi(argv[2])); //Establece la conexión con la máquina remota connect(s,(struct sockaddr*)&des,sizeof(des)); //Envía el mensaje send(s,argv[3],strlen(argv[3])+1,0); printf("\n\n->Enviando: %s, a: %s en el puerto: %s \n",argv[3], argv[1], argv[2]); //Recibe la respuesta recv(s,resp, sizeof(resp) ,0); printf("<-Recibido: %s\n",resp); //Se cierra la conexión (socket) close(s); } else { printf("ERROR al nombrar el socket\n"); } } else { printf("ERROR: El socket no se ha creado correctamente!\n"); } } else { printf("\n\n\aEl número de parámetros es incorrecto\n\n"); } }
|
|
| | Volver arriba | |  | _Leo_
Registrado: 20 Oct 2005 Mensajes: 399 Ubicación: Buenos Aires, Argentina
| Publicado: 23/01/2009 9:14 am | | | Título: |
| No voy a verificar todo el código. Pero está claro que hay un problema conceptual:
Un socket TCP como el que estás creado no asegura la forma en que se enviará la información respecto de la composición de los paquetes. Es decir, si hacés la llamada a send() con los datos "123456789" el sistema puede enviarlos de diferentes formas:
Un paquete con los nueve bytes Nueve paquetes de un byte Un paquete con "1234" y otro con "56789" O cualquier combinación posible. Lo único que te asegura es que los datos van a llegar y que llegarán en orden.
Por lo tanto es indispensable que en la recepción exista un bucle de lectura que rearme los datos. Para eso también es necesario que definas un protocolo para delimitar un paquete de información. Por ejemplo podrías decir que un paquete es una línea de texto. Y en la recepción leer mientras no llega un fin de línea (\n) y cuando llega decir lo que se recibió hasta ahora desde el fin de línea anterior.
La función recv() te dice cuántos bytes recibió. Si dice 0 es que se cortó la conexión y si dice algo menor a cero es un error. Si llamás a recv() se bloqueará hasta recibir al menos un byte y si nunca le llega sólo retornará por time-out, pero después de algunos minutos. _________________ _Leo_ Daphne - administrador de tareas Cine, tecnología, sociedad |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |