Mozilla Aurora es la última versión del navegador Firefox, que viene a ser la versión 7, todavía en fase alfa. Podéis descargarla desde aquí:

http://www.mozilla.com/es-ES/firefox/channel/

El complemento Delicious Bookmarks me encanta pero se le dejó de dar soporte desde la versión 4 de Firefox, por lo que si quieres instalarlo en versiones superiores, en este caso en Mozilla Aurora (V7.0a2) tendrás que realizar los siguientes pasos:

 

image

 

Accede a la ruta:

%appdata%\Roaming\Mozilla\Firefox\Profiles\[tu_id_de_perfil].default\extensions\{2fa4ed95-0317-4c6a-a74c-5f3e3912c1f9}\

Edita con un editor de texto que soporte los retornos de carro en formato UNIX, como puede ser Wordpad, Ultraedit, Notepad++, etc… el fichero Install.rdf

Y modifica la línea de la versión máxima soportada para que ponga:

        <em:maxVersion>7.0a2</em:maxVersion>

También es útil modificar la línea de la versión del complemento para saber que estamos ante una versión modificada:

<em:version>2.3.2</em:version>

Una vez hayas hecho estas modificaciones y vuelvas a arrancar Firefox/Aurora, tendrás la extensión funcionando sin problemas.

Saludos,

Primero descargaremos el iniciador iSCSI de Microsoft:

http://www.microsoft.com/download/en/details.aspx?id=18986

Desde la misma página podéis descargar la versión de 32bit y la de 64bit.

iSCSI-Cluster-Windows-2003-1iSCSI-Cluster-Windows-2003-2

Seleccionamos el driver virtual, el servicio del iniciador que arrancará el iniciador iSCSI cada vez que se inicie el SO y el software para la configuración del iniciador. Seleccionaremos MPIO si queremos que hayan 2 caminos de red para llegar al almacenamiento y así podríamos balancear el tráfico por los 2 caminos.

iSCSI-Cluster-Windows-2003-3

iSCSI-Cluster-Windows-2003-4

Una vez instalado, se habrá creado un icono para ejecutar el software de configuración del iniciador iSCSI.

Antes de empezar a configurar el disco iSCSI deberemos empezar a configurar el clúster, ya que necesitamos la IP virtual desde la que conectaremos con el servidor iSCSI. Así pues, vamos al administrador de clústeres y creamos un nuevo grupo.

iSCSI-Cluster-Windows-2003-5

Añadimos los servidores a los que puede pertenecer el grupo y ponemos el grupo online.

A continuación creamos 2 recursos:

  • Dirección IP – Será la dirección IP virtual desde la cual nos conectaremos al servidor iSCSI desde cualquiera de los nodos del clúster

 

iSCSI-Cluster-Windows-2003-6iSCSI-Cluster-Windows-2003-7

  • Nombre – Será el nombre virtual del servidor clusterizado.

 

iSCSI-Cluster-Windows-2003-8iSCSI-Cluster-Windows-2003-9

*NOTA: Tiene que depender de la IP, sin IP no se puede poner un nombre DNS

iSCSI-Cluster-Windows-2003-10

Y con esto quedará el grupo configurado para tener una IP y un nombre virtual que utilizaremos como origen de la conexión contra el servidor iSCSI. Probaremos que funciona correctamente pasándolo de un servidor a otro y viendo que responde correctamente y ya podemos empezar con la configuración del iniciador iSCSI.

Hay que empezar la configuración en el host donde tengamos el grupo iSCSI del clúster activo, ya que en caso contrario no nos reconocería la IP virtual que acabamos de crear.

Pues vamos al grano… una vez en el software de configuración vamos directamente a la pestaña de “discovery”

iSCSI-Cluster-Windows-2003-11

Y pulsamos en “Add” de la sección “Target Portals” para añadir el servidor iSCSI en el que buscaremos los volúmenes iSCSI compartidos.

Escribimos el nombre del servidor iSCSI y le damos a “Avanzadas”

iSCSI-Cluster-Windows-2003-12

Seleccionamos en “Local Adapter” el driver “Microsoft iSCSI Initiator” y en “Source IP” la dirección virtual que acabamos de crear. Por otra parte, si hemos creado el recurso iSCSI con autenticación CHAP, aquí es donde tenemos que poner el usuario y la contraseña de conexión.

A continuación aceptamos los cambios y vamos a la siguiente pestaña “Targets” y veremos que tenemos ya un “Target” que ha encontrado en el servidor iSCSI que hemos dado de alta anteriormente, seleccionamos el target y pulsamos en “Log On…”

iSCSI-Cluster-Windows-2003-13

Seleccionamos que restaura la conexión en cada arranque, para que el servicio del iniciador iSCSI conecte con este target cuando se reinicie el servidor y si queremos que se llegue a este target por 2 caminos de red diferentes y previamente hemos instalado el MPIO, pues seleccionamos también dicha opción. A continuación pulsamos el botón “Advanced…”

iSCSI-Cluster-Windows-2003-14

En este punto es donde configuramos ya el target y lo asignamos al servidor. Habrá que seleccionar el driver “Microsoft iSCSI Initiator”, la IP origen que hemos puesto en el grupo iSCSI del clúster y si queremos la IP del servidor iSCSI donde nos conectamos, también configuraremos el usuario y la contraseña CHAP que hayamos seleccionado para este target.

Una vez aceptemos los cambios, veremos que el estado de la conexión ha cambiado a “Connected”

iSCSI-Cluster-Windows-2003-15

Y que también nos aparece en la pestaña de “Persistent Targets” al haber marcado que vuelva a conectarse tras los reinicios

iSCSI-Cluster-Windows-2003-16

En este punto, le daremos a aceptar los cambios y ya tenemos el volumen mapeado como si fuera una unidad local de Windows y podremos gestionarlo como cualquier otro volumen y hacer las particiones que necesitemos. Así pues, abrimos el administrador de discos, inicializamos el disco, creamos las particiones, lo formateamos a nuestro gusto y le damos una letra de unidad.

iSCSI-Cluster-Windows-2003-17

Es importante que el disco sea básico, ya que los discos dinámicos no funcionan con el clúster de Windows 2003.

Una vez creado el disco volvemos al software de configuración del iniciador iSCSI, vamos a la pestaña “Bound Volumes/Devices”, le damos al botón “Add” y escribimos el nombre de la unidad que hemos creado y queremos enlazar

iSCSI-Cluster-Windows-2003-18

Con lo cual ya nos aparecerá el volumen enlazado

iSCSI-Cluster-Windows-2003-19

En este punto la configuración iSCSI del primer nodo está finalizada. Antes de añadir el volumen al recurso de clúster tenemos que configurar el iniciador iSCSI en el segundo nodo, así que pasamos el grupo de clúster al otro nodo, para que la IP origen la tenga el nodo 2, y configuramos el iniciador iSCSI de la misma forma que lo hemos hecho en el primer nodo, con la diferencia de que al tener mapeado el disco, directamente nos saldrá la letra de unidad que le hemos puesto en el primer nodo por estar ya formateado, inicializado y con letra asignada.

Una vez finalizada la configuración del iniciador iSCSI en el segundo nodo y comprobado el correcto funcionamiento de la unidad iSCSI, sólo quedará añadir el volumen iSCSI creado al grupo del clúster.

iSCSI-Cluster-Windows-2003-20

NOTA: Es imprescindible que el recurso disco dependa de la IP del grupo del clúster ya que el disco es iSCSI y funciona a través de la red.

iSCSI-Cluster-Windows-2003-21

Comprobamos que funciona correctamente pasando el grupo de un nodo a otro y listo, ya tenemos nuestro recurso iSCSI clusterizado.

Tal y como esta la cosa del trabajo hay que protegerse las espaldas, o al menos hacer que tus «amigos» no te olviden tan facilmente…

Así y sin más dilación, os traigo esta «joyita» que se me ha ocurrido… Un mini-script para que no nos olviden

En general, los que nos dedicamos a los sistemas somos bastante perezosos a la hora de programar, aunque en principio hay un abismo entre programadores o picateclas e IT Pros o pelacables, existe una zona “oscura” para ambos mundos, que son los scripts.

¿Los tendrían que hacer los programadores sin conocimientos profundos de los sistemas o los IT Pros sin conocimientos profundos de programación?

En mi opinión, los IT Pros tenemos que ponernos las pilas y meterle caña al scripting,es muuuuy sencillo el crear un script para automatizar tareas repetitivas o complejas y no requiere grandes conocimientos de programación. Por esto mismo he decidido crear unas series “Scripting People” de ejemplos útiles en nuestra vida para resolver las tareas repetitivas, aburridas o complejas que voy encontrando en mi camino.

Esta vez os dejaré algo facilillo… Un script de reciclado de logs. ¿No os habéis encontrado con sistemas con un disco duro algo escaso y que generan tal cantidad de logs (o archivos) que nos llenan el disco duro y nos tenemos que pelar un montón de horas para solucionar el problema? Pues ahí va mi humilde solución…

Por cierto, no esperéis scripts con un alto nivel de complejidad de código, los explicaré todo lo que considere oportuno y seguro que hay una mejor forma de hacerlos, pero esta es la mía.

Pues esto es todo, con este script podréis hacer un reciclado de logs automático simplemente ejecutándolo diariamente en las tareas programadas. Por supuesto se puede adaptar a nuestras necesidades y mejorar todo lo que queráis.

Espero que os sea útil.

Para poder liberar esos bichos raros e ininteligibles que son las blackberry por IMEI hay que seguir los siguientes sencillos pasos:

1.- Con el IMEI (*#06# o menú-estado) solicitar MEP al operador
2.- Apagar Red Móvil (Menú conexiones)
3.- Ir a Opciones – Opciones Avanzadas – Tarjeta SIM (Aparece ID y nº telefono)
3.- Escribir mepd (si hay mas de 1 letra por tecla hay que pulsar tantas veces como sea necesario) y aparece Red: Activo
4.- Escribir mep2 (si no funciona escribir mepe) Aparecerá una ventana para introducir MEP
5.- Introducir MEP y ya teneis la Blackberry liberada. El campo Red cambiará a Inactivo

A continuación se muestran 6 programas en C (para Linux) que pueden servir de base para la programación de sockets. Los 6 programas son:

– Un cliente TCP para hacer pruebas con los servidores
– Un servidor TCP iterativo
– Un servidor TCP concurrente
– Un cliente SMTP
– Un cliente POP3

1º -> El cliente TCP, para probar el servidor TCP que veremos en 2º lugar.
El cliente es muy simple, está totalmente comentado y lo único que hace es enviar una cadena de texto que introduce el usuario al servidor y leer la respuesta. (Muy útil para el nivel 13 de Hackerslab una vez se haya resuelto lo del problema del camino más corto)

/************************/
/* CLIENTE TCP */
/************************/

#include /*Incluímos las librerías*/
#include
#include
#include
#include
#include
#include
#include
#define SI "s" /*Declaración de constantes*/

void main(void)
{ /*Declaración de variables*/
struct sockaddr_in direccion;
int i,s,contador,length,longitud;
char DATA[256];
char fin[5];
char respuesta[5];
char repeticion[5];
char datos[256];

/*Vacío cadena dirección*/
bzero((char*)&direccion,sizeof(direccion));

/*Imprimo cartel en pantalla*/
printf("_______________________________________\n");
printf(" \n");
printf(" CLIENTE TCP \n");
printf("_______________________________________\n");
printf(" \n");

/*Si el servidor no tuviera un puerto de conexión fijo y nos hubiera dicho el número de puerto por el que tenemos que conectarnos, usaríamos la siguiente función para que el usuario nos dijera el nº de puerto*/

/*printf("INTRODUCE el nº puerto al que conectar \n");*/
/* scanf("%d",fin);*/ /*Leemos nº de puerto*/
/*puerto=atoi(fin);*/ /*Convierte cadena en entero*/

/**DIR SERVIDOR**/
direccion.sin_addr.s_addr=inet_network("127.0.0.1");
/*Dirección del servidor*/
direccion.sin_addr.s_addr=inet_addr("127.0.0.1");
direccion.sin_family=AF_INET;/*Familia de Protocolo AF_INET*/
direccion.sin_port=htons(1999);/*Usamos el puerto fijo 1999*/

s=socket(AF_INET,SOCK_STREAM,0); /*Creamos un socket*/
if(s<0) /*Si hay un error al crearlo, lo mostramos en pantalla*/

{ printf("ERROR al crear el socket\n"); }

printf("\n");

printf("Introduce la cadena a enviar: "); /*Petición de datos*/

/*Leemos los datos y medimos su longitud*/

gets(DATA);longitud=strlen(DATA);

/*Imprimimos la longitud de la cadena por pantalla*/

printf("la longitud es : %d \n", longitud);

/*********************/

if(connect(s,(struct sockaddr*)&direccion,sizeof(direccion))<0) {

/*Intentamos conectar con el servidor*/

printf("ERROR al conectar "); /*Si falla imprime un error*/

} else {

printf("he aceptado la conexion\n"); }

/***********************/

do{ /*Repite hasta que el cliente no quiera introducir más datos*/

if(send(s,DATA,strlen(DATA),0)<0) /*Enviamos datos al servidor*/ {

printf("ERROR AL ENVIAR \n");

} else /*Si no hay error al enviar…*/ {

bzero(datos,sizeof(datos)); /*Vacía la cadena datos*/

read(s,datos,sizeof(datos)); /*Lee el mensaje del servidor*/

printf("Mensaje Recibido: "); /*y lo imprime en pantalla*/

for(i=0;i

Servidor TCP iterativo. Recoge peticiones de una en una.
Lo que hace este servidor es recibir la cadena que manda el cliente, encriptarla con una función muy simple (a la vez que chapucera) y devolverla al cliente.

El proceso de encriptación, permuta la posición de letras correlativas, es decir… Hola se vuelve oHal y adios se vuelve daois.

/********************************/
/* SERVIDOR ITERATIVO */
/********************************/

#include /*Incluímos las librerías*/
#include
#include
#include
#include
#define TRUE 1 /*Definición de constantes*/

main () /*Programa Principal*/

{
char buf_in[1024]; /*Definición de variables*/
char buf_out[1024];
int rval,caracter,caracter0;
int i,contador;
int sock,length;
struct sockaddr_in server ;
int msgsock;

sock=socket(AF_INET,SOCK_STREAM,0); /*Creamos el socket*/

if(sock<0){ /*Si el identificador de socket es negativo…*/

/*Imprime por pantalla el error*/

fprintf(stderr,"Abriendo un socket de tipo stream. \n");

exit(1); /*y sale del programa*/ }

server.sin_family=AF_INET; /*Familia de protocolo AF_INET*/ server.sin_addr.s_addr=inet_network("127.0.0.1"); /*Dirección del servidor*/ server.sin_addr.s_addr=inet_addr("127.0.0.1");

server.sin_port=htons(1999); /*Nº de puerto*/

/*Asociamos socket a la dirección del servidor*/

if(bind(sock,&server,sizeof(server)) ){

fprintf(stderr,"Nombrando al socket de tipo stream.\n");

/*Si ha habido un error, se imprime en pantalla y sale del programa*/

exit(1); }

/*Función que averigua el nº de puerto que ha asignado el sistema operativo, en el caso de que se le pida a éste que asigne un puerto automáticamente*/

/* length=sizeof(server);

if(getsockname(sock,&server,&length)) {

fprintf(stderr,"Obteniendo el puerto para el socket");

exit(1);}*/

printf("El socket tiene el puerto %d\n", ntohs(server.sin_port));

/*Nos quedamos a la escucha con una cola para 5 clientes*/

listen(sock,5);

do { /*Repite el bucle infinítamente*/

/*Aceptamos la petición de conexión del cliente*/

msgsock=accept(sock,0,0);

/*Si ha habido un fallo en la aceptación de conexión…*/

if(msgsock==-1)

/*…imprime el error por pantalla*/

fprintf(stderr,"Fallo en la función accept.\n");

/*Si todo ha ido bien y mientras el cliente no cierre la conexión…*/

else do bzero(buf_in,sizeof(buf_in)); /*Vacía el búfer de entrada*/

/*Lee datos del cliente y si obtiene un error…*/

if((rval=read(msgsock,buf_in,1024))<0)

/*…lo imprime en pantalla*/

perror("ERROR: Leyendo el mensaje.\n");

if(rval==0) /*Si lee un NULL (Desconexión) del cliente…*/

/*…imprime que finaliza la conexión*/

printf("Finalizando la conexion.\n");

else /*Si no…*/

/*Imprime el mensaje que recibe del cliente*/

printf("Mensaje: %s\n",buf_in);

contador=0; /*Inicializamos contador*/

/*Vaciamos el bufer de salida*/

bzero(buf_out,sizeof(buf_out));

for(contador=0;contador<0)

/*Si hay error lo muestra*/

fprintf(stderr,"Fallo en la funcion Write.\n");

/*Mientras que el cliente no cierre la conexión*/

}while (rval !=0);

close(msgsock); /*Cierra el socket y la conexión con el cliente*/

}while(TRUE); /*Bucle infinito*/ }

*************************************************

3º -> Servidor TCP Concurrente.
Pues lo mismo que antes pero para cada petición crea un hijo que la atiende, así se pueden atender tantas peticiones a la vez como procesos hijo (memoria disponible) se puedan crear.

/********************************/
/* SERVIDOR CONCURRENTE */
/********************************/

#include /*Incluímos las librerías*/
#include
#include
#include
#include
#include "service.h"
#define TRUE 1 /*Definición de constantes*/

main () /*Programa Principal*/

{ /* Definición de variables*/
char buf_in[1024];
char buf_out[1024];
int rval,caracter,caracter0;
int i,contador;
int sock,length;
struct sockaddr_in server ;
int msgsock;

/*Creación del socket de escucha*/
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0){

/*Si tenemos un error, lo muestra en pantalla*/

/*y sale del programa*/

fprintf(stderr,"Abriendo un socket de tipo stream. \n");

exit(1); }

server.sin_family= AF_INET; /*Familia de protocolo AF_INET*/

server.sin_addr.s_addr=inet_network("127.0.0.1"); /*Dirección*/

server.sin_addr.s_addr=inet_addr("127.0.0.1"); /* del servidor*/

server.sin_port=htons(1999); /*Puerto fijo (nº1999)*/

if(bind(sock,&server,sizeof(server)) ){

/*Asociamos el socket a la dirección del servidor*/

fprintf(stderr,"Nombrando al socket de tipo stream.\n");

/*Si nos da un error, lo mostramos en pantalla y salimos del programa*/

exit(1); }

length=sizeof(server); /*longitud de la dirección del servidor*/

/*Función que averigua el nº de puerto que ha asignado el sistema operativo, en el caso de que se le pida a éste que asigne un puerto automáticamente*/

/* if(getsockname(sock,&server,&length)) {

fprintf(stderr,"Obteniendo el puerto para el socket");

exit(1);}*/

printf("El socket tiene el puerto %d\n", ntohs(server.sin_port));

/*Nos quedamos a la escucha con una cola para 5 clientes*/

listen(sock,5);

do { /*Repite el bucle infinítamente*/

/*Aceptamos la petición de conexión del cliente…*/

msgsock=accept(sock,0,0);

/*…y creamos el socket de servicio*/

/*Si ha habido un fallo en la aceptación de conexión…*/

if(msgsock==-1)

/*…imprime el error por pantalla*/

fprintf(stderr,"Fallo en la función accept.\n");

else{

/*Creación de un proceso hijo*/

if(fork()==0){

/*Si no hay error al crear el proceso hijo*/

/*El proceso de servicio ya no usa el socket de escucha*/

close(sock);

/*Paso la petición del cliente al proceso hijo*/

service(msgsock,&server,length); exit(0);}

/*El proceso padre ya no usa el socket de servicio*/

close(msgsock);}

}while(TRUE); /*Bucle infinito*/ }

*************************************************

4º -> Librería con funciones para el servidor concurrente (está hecha sólo por ver como se hacían y trataban librerías en C, realmente no hace falta pero queda bonito ;-)))))

/************************************************/
/* LIBRERÍA DEL SERVIDOR CONCURRENTE */
/************************************************/

#ifndef _SERVICE_H /*Veo si no está definida mi función, y…*/
#define _SERVICE_H /*…si no está la defino*/

#include /*Incluyo las librerías*/
#include
#include
#include
#include

/*Defino las funciones que voy a usar*/
void service(int socket_hijo,struct sockaddr_in *adr,int lgadr);

#endif
/*Función de encriptación*/
void service(int socket_hijo,struct sockaddr_in *adr,int lgadr)
{
/*Definición de variables*/
char buf_in[1024];
char buf_out[1024];
int contador,rval,caracter,caracter0;

/*Mientras que el cliente no nos haga una petición de desconexión*/
do

bzero(buf_in,sizeof(buf_in)); /*Vacío el búfer de entrada*/
/*Leo mensaje del cliente*/
if((rval=read(socket_hijo,buf_in,sizeof(buf_in)))<0)

/*Si ha habido un error, lo imprimo en pantalla*/

perror("ERROR: Leyendo el mensaje.\n");

if(rval==0) /*Si recibo una petición de desconexión…*/

/*Imprimo que he finalizado la conexión*/

printf("Finalizando la conexion.\n");

else

printf("Mensaje: %s\n",buf_in); /*si no, imprimo el mensaje*/

contador=0; /*Inicializo el contador*/

bzero(buf_out,sizeof(buf_out)); /*Vacío el búfer de salida*/

for(contador=0;contador<=sizeof(buf_in); contador=contador+2) {

/*Algoritmo de encriptación*/

caracter0=buf_in[contador];

caracter=buf_in[contador+1];

/*Si la palabra es impar no cambia el último carácter*/

if(caracter!=0) {buf_out[contador]=caracter; buf_out[contador+1]=caracter0;}

else buf_out[contador]=caracter0;}

/*Envío respuesta al cliente*/

if(send(socket_hijo,buf_out,strlen(buf_out),0)<0)

/*Si falla, lo muestro*/

fprintf(stderr,"Fallo en la funcion Send.\n");

/*Mientras que el cliente no nos haga una petición de desconexión*/

}while (rval !=0);

close(socket_hijo); /*Cerramos el socket hijo*/

}; /*Fin de la librería*/

***********************************************

5º -> Cliente SMTP. Sencillito cliente para enviar mensajes de correo. Es como automatizar el proceso de hacerlo por telnet.

/************************/
/* CLIENTE SMTP */
/************************/

#include /*Incluímos las librerias a utilizar*/
#include
#include
#include
#include
#include
#include
#include

/*Definimos las constantes a utilizar*/
#define AUXILIAR "RCPT TO:"
#define REMITE "MAIL FROM:"
#define HOLA "HELO UPV.es\n"
#define CUERPO "DATA\n"
#define crlf "\n"
#define FIN "QUIT\n"
#define PUNTO ".\n"
#define SI "s"

/*Programa Principal*/
void main(void)
{

struct sockaddr_in direccion; /*Definimos las variables*/
int i,s,contador,length,longitud;
char fin[5];
int puerto;
char aux[250];
char aux1[250] = "RCPT TO:";
char respuesta[254];
char mensaje[1024];
char repeticion[50];
char DATA[250];
char datos[250];

bzero((char*)&direccion,sizeof(direccion)); /*Vacía dirección*/
/*Imprime cartel en pantalla*/
printf("_______________________________________\n");
printf(" \n");
printf(" CLIENTE SMTP \n");
printf("_______________________________________\n");
printf(" \n");

/**DIR SERVIDOR**/
/*Dirección del servidor SMTP*/
direccion.sin_addr.s_addr=inet_network("158.42.2.4");
direccion.sin_addr.s_addr=inet_addr("158.42.2.4");
direccion.sin_family=AF_INET; /*Familia de protocolo AF_INET*/
direccion.sin_port=htons(25); /*Puerto SMTP nº25*/

s=socket(AF_INET,SOCK_STREAM,0); /*Creación del socket*/
if(s<0) /*Si ha habido un error…*/

{ /*…se imprime en pantalla*/

printf("ERROR al crear el socket\n"); }

printf("\n");

/*Intentamos conectar con el servidor*/

if(connect(s,(struct sockaddr*)&direccion,sizeof(direccion))<0) {

/*Si hay error, se imprime en pantalla y sale del programa*/

printf("ERROR AL CONECTAR \n");

exit(1);

} else /*si no ha habido error…*/

{ printf("Servidor (connect):\n"); /*Imprime en pantalla*/

bzero(&datos,sizeof(datos)); read(s,datos,sizeof(datos)); /*Lee los datos del servidor*/

longitud=sizeof(datos); /*Calcula longitud de los datos*/

/*Imprime los datos en pantalla*/

for(i=0;i<=250;i++){datos[i]=0;} /*Vacía cadena datos*/

for(i=0;i<0) {

/*Intenta enviar el HELO*/

/*Si hay un error en el envío se muestra en pantalla*/

printf("ERROR AL ENVIAR \n");

} else {

printf("Servidor (HELO):\n"); /*Imprime en pantalla*/

/*Leemos respuesta del servidor*/

read(s,datos,sizeof(datos)); longitud=sizeof(datos);

/*Calcula longitud de los datos*/

/*Imprime los datos en pantalla*/

for(i=0;i<0)

/*Envía cadena aux*/

{ printf("ERROR AL ENVIAR \n");

} else {

printf("Servidor (MAIL FROM):\n"); /*Imprime en pantalla*/

read(s,datos,sizeof(datos)); /*Lee los datos del servidor*/

longitud=sizeof(datos); /*Calcula longitud de los datos*/

/*Imprime los datos en pantalla*/

for(i=0;i<0)

/*Envía cadena aux1*/

{ printf("ERROR AL ENVIAR \n");

} else {

printf("Servidor (RCPT TO:):\n "); /*Imprime en pantalla*/

read(s,datos,sizeof(datos)); /*Lee los datos del servidor*/

longitud=sizeof(datos); /*Calcula longitud de los datos*/

/*Imprime los datos en pantalla*/

for(i=0;i<0)

/*Envía "DATA"*/

{ printf("ERROR AL ENVIAR \n");

} else {

printf("Servidor (DATA): "); /*Imprime en pantalla*/

read(s,datos,sizeof(datos)); /*Lee los datos del servidor*/

longitud=sizeof(datos); /*Calcula longitud de los datos*/

/*Imprime los datos en pantalla*/

for(i=0;i<0)

/*Envía cadena*/

{ printf("ERROR AL ENVIAR \n"); }

/*Mientras que no se escriba un punto sólo*/

}while(strcmp(PUNTO,mensaje)!=0);

printf("Servidor (FIN MENSAJE): "); /*Imprime en pantalla*/

read(s,datos,sizeof(datos)); /*Lee los datos del servidor*/

longitud=sizeof(datos); /*Calcula longitud de los datos*/

/*Imprime los datos en pantalla*/

for(i=0;i<0)

/*Envía "QUIT" al servidor*/

{ printf("ERROR AL ENVIAR \n");

} else {

/*Imprime en pantalla*/

printf("Servidor (CIERRA CONEXION): ");

read(s,datos,sizeof(datos)); /*Lee los datos del servidor*/

longitud=sizeof(datos); /*Calcula longitud de los datos*/

/*Imprime los datos en pantalla*/

for(i=0;i

Cliente POP3. Pues lo mismo que el anterior, pero para bajarse el correo del servidor.

/************************/
/* CLIENTE POP3 */
/************************/

#include /*Definimos las librerías*/
#include
#include
#include
#include
#include
#include
#include

#define USUARIO "USER " /*Definimos las constantes*/
#define PASSWORD "PASS "
#define LISTADO "STAT\n"
#define LEER "RETR "
#define BORRAR "DELE "
#define CRLF "\n"
#define FIN "QUIT\n"
#define PUNTO ".\n"
#define SI "s"
#define MENOS "-"
#define BIEN "Todo va Bien!!!"
#define MAL "error del servidor"

void main(void) /*Programa principal*/
{

/*Definimos las variables a utilizar*/
struct sockaddr_in direccion;
int i,j,s,contador,length,longitud;
char fin[5];
int puerto;
char aux[250];
char respuesta[254];
char mensaje[1024];
char repeticion[50];
char DATA[250];
char error[30];
char msge[2000];
char datos[250];

/*Vacía la cadena dirección*/
bzero((char*)&direccion,sizeof(direccion));
/*Imprime en pantalla*/
printf("_______________________________________\n");
printf(" \n");
printf(" CLIENTE POP3 \n");
printf("_______________________________________\n");
printf(" \n");

/**DIRECCIÓN DEL SERVIDOR**/
direccion.sin_addr.s_addr=inet_network("158.42.2.4");
/*Dirección del servidor POP3*/
direccion.sin_addr.s_addr=inet_addr("158.42.2.4");
direccion.sin_family=AF_INET; /*Familia de protocolo AF_INET*/
direccion.sin_port=htons(110); /*Puerto POP3 (110)*/

s=socket(AF_INET,SOCK_STREAM,0); /*Creamos el socket*/
if(s<0) /*Si el identificador de socket es negativo…*/
{
printf("ERROR al crear el socket\n"); /*…ha habido un error*/
}
printf("\n");

/*Establecemos la conexión y si nos devuelve un entero negativo…*/
if(connect(s,(struct sockaddr*)&direccion,sizeof(direccion))<0)
{
printf("ERROR AL CONECTAR \n"); /*…ha habido un error…*/
exit(1); /*…y salimos del programa*/
}
else /*Si la conexión ha tenido éxito…*/
{
printf("Servidor (connect):\n"); /*Imprime en pantalla*/
/*Leemos los datos que envia el servidor*/
read(s,datos,sizeof(datos));
longitud=strlen(datos); /*Longitud de la cadena datos*/

/*Imprime en pantalla la cadena datos (respuesta del servidor)*/
for(i=0;i
for(i=0;i<=250;i++){datos[i]=0;} /*Vaciamos la cadena datos*/
printf("\n");
}
/*Repetimos el siguiente bucle hasta que no haya error en el login o en el password*/
do{
printf("Introduzca su Login: "); /*Pedimos el Login*/
gets(respuesta); /*Almacenamos login en respuesta*/
bzero(aux,sizeof(aux)); /*Vaciamos la cadena aux*/
/*Concatenamos USUARIO(USER) con aux;aux=aux+USER */
strcat(aux,USUARIO);
/*Concatenamos aux con los datos del login "USER datos"*/
strcat(aux,respuesta);
/*Concatenamos "USER datos" con un retorno de carro(\n) para que el servidor nos reconozca los comandos*/
strcat(aux,CRLF);

/*Enviamos el resultado de las concatenaciones "USER datos\n"*/
if(send(s,aux,strlen(aux),0)<0)

{
/*Si no tiene éxito en enviar, imprime el error*/
printf("ERROR AL ENVIAR \n");
}

else /*Si envía bien…*/
{
printf("Servidor (USER):\n");/*Imprime en pantalla*/
read(s,datos,sizeof(datos)); /*Leemos los datos del servidor*/
longitud=sizeof(datos); /*Calculamos longitud de los datos*/
/*Imprime en pantalla la cadena datos (respuesta del servidor)*/
for(i=0;i
for(i=0;i<=250;i++){datos[i]=0;} /*Vaciamos la cadena datos*/
bzero(respuesta,sizeof(respuesta)); /*Vaciamos respuesta*/
printf("\n");
}

printf(" Introduzca su Password: "); /*Pedimos la contraseña*/
gets(respuesta); /*Almacenamos la contraseña en respuesta*/
bzero(aux,sizeof(aux)); /*Vaciamos la cadena aux*/
strcat(aux,PASSWORD); /*Concatenamos PASSWORD(PASS) con aux*/
strcat(aux,respuesta); /*Concatenamos aux
con los datos introducidos "PASS datos"*/

/*Concatenamos "PASS datos" con un retorno de carro(\n) para que el servidor nos reconozca los comandos*/
strcat(aux,CRLF);

/*Enviamos los datos "PASS datos\n" al servidor*/
if(send(s,aux,strlen(aux),0)<0)

{
printf("ERROR AL ENVIAR \n");
}

else
{
printf("Servidor (PASSWORD):\n");
read(s,datos,sizeof(datos)); /*Leemos los datos del servidor*/
longitud=sizeof(datos);
for(i=0;i
bzero(error,sizeof(error)); /*Reseteamos la cadena error*/

/*El carácter error es igual al primer carácter de la cadena datos*/
error[0]=datos[0];

/*Si la primera letra de la respuesta del servidor es ‘-‘ vuelve a preguntar login, ya que el servidor nos habra devuelto un -ERR*/
if(strcmp(error,MENOS)==0){strcpy(error,MAL);}
for(i=0;i<=250;i++){datos[i]=0;} /*Vaciamos la cadena datos*/
/*Vaciamos la cadena respuesta*/
bzero(respuesta,sizeof(respuesta));
printf("\n");
}

/*Si ha habido un -ERR, vuelve a repetir el bucle desde Login*/
}while(strcmp(error,MAL)==0);

/*Enviamos un listado (STAT) al servidor para que nos diga los mensajes que tenemos*/
if(send(s,LISTADO,5,0)<0)

{
printf("ERROR AL ENVIAR \n");
}

else /*Si no ha habido error al enviar los datos…*/
{
printf("Servidor (STAT): ");
/*Leemos la respuesta del servidor*/
read(s,datos,sizeof(datos));
/*Calculamos la longitud de la cadena datos*/
longitud=strlen(datos);
for(i=0;i
for(i=0;i<=250;i++){datos[i]=0;}
printf("\n");
}

do{ /*Repetimos el bucle mientras queramos leer más mensajes*/

printf("Introduzca el numero de mensaje a leer: (‘INTRO’ para
no leer ninguno)\n");

gets(respuesta); /*Obtenemos el número del mensaje a leer*/
bzero(aux,sizeof(aux)); /*Reseteamos la cadena aux*/
strcat(aux,LEER); /*Metemos leer (RETR) en la cadena aux*/
strcat(aux,respuesta); /*Concatenamos la respuesta obtenida
al aux "RETR respuesta"*/
/*Ponemos un retorno de carro (\n) al final de aux*/
strcat(aux,CRLF);
/*Reseteamos la cadena respuesta*/
bzero(respuesta,sizeof(respuesta));
/*Enviamos "RETR respuesta\n" al servidor*/
if(send(s,aux,strlen(aux),0)<0)
{
printf("ERROR AL ENVIAR \n");
}

else /*Sino ha habido error al enviar…*/
{
printf("Servidor (RETR:):\n ");
/*Leemos la respuesta del servidor*/
read(s,msge,sizeof(msge));
longitud=strlen(msge);
/*y la imprimimos*/
for(i=0;i
for(i=0;i<=250;i++){msge[i]=0;}
printf("\n");
}

printf("¨Quiere leer mas mensajes? (s/n) ");
gets(repeticion); /*Leemos la respuesta*/

/*Si la respuesta es "s" repetimos el bucle*/
}while(strcmp(SI,repeticion)==0);

do{ /*Repetimos el bucle mientras queramos borrar más mensajes*/
printf("Introduzca el n£mero de mensaje a borrar: (‘INTRO’ para no borrar ninguno)\n");
gets(respuesta); /*Lo siguiente es análogo al bucle anterior*/
bzero(aux,sizeof(aux));
strcat(aux,BORRAR);
strcat(aux,respuesta);
strcat(aux,CRLF);
bzero(respuesta,sizeof(respuesta));

/*Aquí enviamos "DELE respuesta\n"*/
if(send(s,aux,strlen(aux),0)<0)
{
printf("ERROR AL ENVIAR \n");
}

else

{
printf("Servidor (DELE):\n ");
/*Leemos respuesta del servidor*/
read(s,datos,sizeof(datos));
longitud=sizeof(datos);
for(i=0;i
for(i=0;i<=250;i++){datos[i]=0;}
printf("\n");
}

printf("Quiere borrar más mensajes? (s/n) ");
gets(repeticion);

/*Si la respuesta es "s" repetimos el bucle*/
}while(strcmp(SI,repeticion)==0);

/*Enviamos la desconexión (QUIT) al servidor*/
if(send(s,FIN,5,0)<0)
{
printf("ERROR AL ENVIAR \n");
}
else
{
printf("Servidor (CIERRA CONEXION): ");
/*Leemos la respuesta del servidor*/
read(s,datos,sizeof(datos));
longitud=sizeof(datos);
for(i=0;i
for(i=0;i<=250;i++){datos[i]=0;}
printf("\n");
}
} /*Fin del programa*/

************************************************

Uso avanzado del comando ping en sistemas Windows

Ping acepta numeración decimal, octal y hexadecimal de la siguiente forma:

Decimal – ping 10.0.0.1: Haciendo ping a 10.0.0.1 con 32 bytes de datos:
Octal (Con un 0 delante) – ping 010.0.0.1: Haciendo ping a 8.0.0.1 con 32 bytes de datos:
Hexadecimal (Con 0x delante) – ping 0x10.0.0.1: Haciendo ping a 16.0.0.1 con 32 bytes de datos:

Se pueden omitir los 0’s intermedios:
ping 10.1: Haciendo ping a 10.0.0.1 con 32 bytes de datos:
ping 0x10.1: Haciendo ping a 16.0.0.1 con 32 bytes de datos:
ping 10.1.1: Haciendo ping a 10.1.0.1 con 32 bytes de datos:

Averiguar la MTU resultante de la red:
Usando el tamaño del paquete (-l tamaño) y obligando a que no fragmente (-f)

ping -l 1472 -f google.com
Haciendo ping a google.com [64.233.167.99] con 1472 bytes de datos:
Respuesta desde 64.233.167.99: bytes=56 (enviados 1472) tiempo=140ms TTL=235

ping -l 1473 -f google.com
Haciendo ping a google.com [64.233.167.99] con 1473 bytes de datos:
Es necesario fragmentar el paquete pero se especificó DF.

En este caso la MTU resultante de la red sería de 1472

Y bueno, con esto espero haber dicho algo nuevo del archiconocido ping…

Saludos,

Hola a tod@s,

Con este post queda inagurado un nuevo blog en el que iré poniendo artículos, espero que interesantes, sobre la administración de sistemas en español.

La razón de crear este blog es porque veo un gran déficit de webs sobre administración "avanzada" de sistemas en castellano, así que vamos a intentar empezar a crear algo por aquí.

Espero que sea de vuestro agrado…

Saludos,