Google Web

21 sept. 2009

El backup de los recuerdos

Mirando un poco en mis antiguos codigos, me encontre con perlitas, que no recordaba a ver creado y quiero compartir, dada su simpleza y belleza, ja! Digan lo que digan. Así que en este post, les muestro un elegante checador de server en C++ que abria un socket para mandar correo por SMTP. Creo que lo interesante es el modesto uso de un Winsock para hacer una tarea simple, no como las niñas novatas de hoy en dia, que si no encuentran una librería SMTP se matan.

Les dejo el código:


#include
#include "winsock2.h"

#pragma comment(lib,"Shell32.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib,"Ws2_32.lib")

SOCKET SMTPSock;

void rd() {
char recvbuf[512] = "";
recv(SMTPSock, recvbuf, 512, 0);
printf("Server - %s\n", recvbuf);
}

void snd(char * cmd, int ret) {
printf("Client - %s\n", cmd);
send(SMTPSock, cmd, strlen(cmd), 0);
if (ret > 0) { rd(); }
}

void sendmail(char * to, char * subject, char * mess)
{
char To[265], Subject[256], Mess[256];
strcpy(To, "RCPT TO:");
strcat(To, to);
strcat(To, "\r\n\0");
strcpy(Subject, "SUBJECT:");
strcat(Subject, subject);
strcat(Subject, "\r\n\0");
strcpy(Mess, mess);
strcat(Mess, "\r\n.\r\n\0");

WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");

SMTPSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (SMTPSock == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
}

sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("MYIP");
clientService.sin_port = htons(25);

if (connect(SMTPSock, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return;
}
rd();
snd("HELO\r\n", 1);
snd("MAIL FROM:Servidores\r\n", 1);
snd(To, 1);
snd("DATA\r\n", 1);
snd(Subject, 0);
snd(Mess, 0);
snd("QUIT\r\n", 1);

WSACleanup();
}

void main() {
__int64 tspace, fspace;
SHGetDiskFreeSpaceEx("C:\\", NULL, (PULARGE_INTEGER) &tspace, (PULARGE_INTEGER) &fspace);
tspace = (tspace / 1024) / 1024;
fspace = (fspace / 1024) / 1024;

if (fspace < (tspace/2)) {
char buffer[256], buffer2[50], subject[256];
DWORD dw = 50;
sprintf(buffer, "El servidor cuenta con: %I64dMb/%I64dMb", fspace, tspace);
printf("OK1");
GetComputerName(buffer2, &dw);
printf("OK2");
strcpy(subject, "Espacio en disco muy bajo en ");
strcat(subject, buffer2);
printf("OK3");
sendmail("Simio Geek", subject, buffer);
}
return;
}