/
Inicio :: Foros

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

Ayuda con cidigo socket porfavor...

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



Registrado: 05 Dic 2008
Mensajes: 1

MensajePublicado: 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

MensajePublicado: 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
      Í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