Ayuda con cidigo socket porfavor...

Temas relacionados con la programación de aplicaciones que funcionan sobre un servidor.
Responder
Mensaje
Autor
visualfree
Mensajes: 1
Registrado: 05/12/2008 1:20 pm

Ayuda con cidigo socket porfavor...

#1 Mensaje por visualfree » 05/12/2008 1:29 pm

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: Seleccionar todo

#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: Seleccionar todo

 #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");
 }
 }



Avatar de Usuario
_Leo_
Mensajes: 399
Registrado: 20/10/2005 11:00 pm
Ubicación: Buenos Aires, Argentina
Contactar:

#2 Mensaje por _Leo_ » 23/01/2009 9:14 am

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:
  1. 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.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados