/* --------------------------------------------------------------------- */ /* Ricardo Ortega O. - 2000 - 2002 */ /* Programa SERVER para implementar conexion usando sockets */ /* Este programa recibe del cliente un nombre de capital (ciudad) o pais */ /* y devuelve el nombre asociado capital o pais (ver tablas abajo) */ /* devuelve nulos si el nombre no es reconocido */ /* --------------------------------------------------------------------- */ #include #include #include #include #include #include struct sockaddr_in midireccion; /* socket para direccion del local */ struct sockaddr_in sudireccion; /* socket para direccion del remoto */ struct hostent *hp; /* pointer para informacion de host remoto */ int s; /* Socket para conexion */ int ls; /* Socket para escuchar */ int addrlen; /* Longitud de la direccion */ char respuesta [40]; /* Buffer para la respuesta */ #define MLN 20 /* Maxima longitud del nombre */ #define MNN 10 /* Maximo Numero de Nombres */ char TablaPaises [MNN][MLN] = { "Ecuador", "Peru", "Colombia", "Venezuela", "Bolivia", "Argentina", "Brasil", "Paraguay", "Uruguay", "Chile" }; char TablaCiudades [10][MLN] = { "Quito", "Lima", "Bogota", "Caracas", "La Paz", "Buenos Aires", "Brasilia", "Asuncion", "Montevideo", "Santiago" }; void Buscar_Nombre (char n1[], char n2[]); char *inet_ntoa(); main (int argc, char *argv[]) { midireccion.sin_family = AF_INET; midireccion.sin_addr.s_addr = INADDR_ANY; midireccion.sin_port = 8801; ls = socket (AF_INET, SOCK_STREAM, 0); if (ls == -1) { fprintf(stderr, "%s: No se puede crear socket\n", argv[0]); exit(1); } if (bind(ls, (struct sockaddr *)&midireccion, sizeof(struct sockaddr_in)) == -1) { fprintf(stderr, "%s: No se puede asociar socket\n", argv[0]); exit(1); } if (listen(ls, 5) == -1) { fprintf(stderr, "%s: no puede escuchar por el socket\n", argv[0]); exit(1); } server (); } server (void) { int addrlen; char buf[100]; char *hostname; int len, len1; printf ("Esperando pedido desde un cliente.\n"); addrlen = sizeof(struct sockaddr); s = accept (ls, (struct sockaddr *)&sudireccion, &addrlen); close (ls); hp = gethostbyaddr ((char *) &sudireccion.sin_addr, sizeof (struct in_addr), sudireccion.sin_family); if (hp == NULL) hostname = inet_ntoa(sudireccion.sin_addr); else hostname = hp->h_name; /* point to host's name */ printf("Inicio de conexion desde %s puerto %u\n", hostname, ntohs(sudireccion.sin_port)); while (len = recv (s, buf, 40, 0)) { if (len == -1) { printf("Conexion con %s terminada\n", hostname); exit(1); } printf ("Busca nombre %s\n",buf); Buscar_Nombre (buf, respuesta); printf ("Envia respuesta %s\n",respuesta); if ( send (s, respuesta, 40, 0) != 40) { printf("Conexion con %s terminada\n", hostname); exit(1); } } close (s); } // Funcion que compara cadenas mayusculas o minusculas int stricmp (char *s1, char *s2) { while (*s1) { if (toupper(*s1) != toupper(*s2)) return toupper(*s1) - toupper(*s2); ++s1; ++s2; } return 0; } /* Funcion que busca el nombre n1 en la tabla y copia su equivalente a n2 */ void Buscar_Nombre (char n1[], char n2[]) { int i; for (i=0; i < MNN; i++) { if (stricmp (n1, TablaPaises[i]) == 0) { strcpy (n2, TablaCiudades[i]); return; } } for (i=0; i < MNN; i++) { if (stricmp (n1, TablaCiudades[i]) == 0) { strcpy (n2, TablaPaises[i]); return; } } strcpy (n2, ""); } /* --------------------------------------------------------------------- */