#include <iostream> #include <Windows.h> #include <winsock.h> #include <afirmar.h> #include <cadena> usando el espacio de nombres estándar; #pragma comment (lib, "ws2_32.lib") typedef char uint8; typedef unsigned long uint32; static uint8 alphabet_map [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /"; static uint8 reverse_map [] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 , 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255 63 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 255, 255 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255 }; uint32 base64_encode (const uint8 * text, uint32 text_len, uint8 * encode) { uint32 i, j; for (i = 0, j = 0; i + 3 <= text_len; i + = 3) { encode [j ++] = alphabet_map [text [i] >> 2]; // Elimina los primeros 6 dígitos del primer carácter y encuentra el carácter de resultado correspondiente encode [j ++] = alphabet_map [((text [i] << 4) & 0x30) | (text [i + 1] >> 4)]; // will Combine los últimos 2 dígitos de un carácter con los primeros 4 dígitos del segundo carácter y encuentre la codificación de caracteres correspondiente [j ++] = alphabet_map [((text [i + 1] << 2) & 0x3c) | (text [ i + 2] >> 6)]; // Combina los últimos 4 dígitos del segundo carácter con los primeros 2 dígitos del tercer carácter y encuentra la codificación de caracteres correspondiente [j ++] = alphabet_map [text [i + 2 ] & 0x3f]; // Elimina los últimos 6 dígitos del tercer carácter y encuentra el carácter resultante } if (i <text_len) { uint32 tail = text_len-i; si (cola == 1) { encode [j ++] = alphabet_map [text [i] >> 2]; encode [ j ++] = alphabet_map [(text [i] << 4) & 0x30]; encode [j ++] = '='; encode [j ++] = '='; } else // tail == 2 { encode [j ++] = alphabet_map [text [i] >> 2]; encode [j ++] = alphabet_map [((text [i] << 4) & 0x30) | (text [i + 1] >> 4)]; encode [j ++] = alphabet_map [(text [i + 1] << 2) & 0x3c]; codificar [j ++] = '='; } } return j; } uint32 base64_decode (const uint8 * code, uint32 code_len, uint8 * plain) { // afirmar ((code_len & 0x03) == 0) ; // Si su condición devuelve un error, finalice la ejecución del programa. Múltiple de 4. uint32 i, j = 0; uint8 quad [4]; for (i = 0; i <code_len; i + = 4) { for (uint32 k = 0; k <4; k ++) { quad [k] = reverse_map [code [i + k]]; // Agrupando, cada grupo de cuatro se convierte en números decimales en la tabla base64 a su vez } afirmar (quad [0] <64 && quad [1] <64) ; plain [j ++] = (quad [0] << 2) | (quad [1] >> 4); // Elimina los primeros 6 dígitos del primer carácter correspondiente al número decimal de la tabla base64 y el segundo carácter correspondiente a la base64 Los primeros dos dígitos del número decimal de la tabla se combinan si (quad [2]> = 64) se rompe; de lo contrario, si (quad [3]> = 64) { plain [j ++] = (quad [1] << 4) | ( quad [2] >> 2); // Elimina los últimos 4 dígitos de la tabla base64 correspondiente al segundo carácter y los primeros 4 dígitos de la tabla base64 correspondiente al tercer carácter a dividir; } else { plain [ j ++] = (quad [1] << 4) | (quad [2] >> 2); simple [j ++] = (quad [2] << 6) | quad [3]; // Elimina el tercer carácter Los dos últimos dígitos del número decimal correspondiente a la tabla base64 se combinan con el cuarto carácter } } return j; } char * base64 (char * input) { uint8 * text = (uint8 *) entrada; uint32 text_len = (uint32) strlen (( char *) text); uint8 buffer [1024],tampón2 [4096]; uint32 size = base64_encode (text, text_len, buffer2); buffer2 [tamaño] = '\ 0'; return buffer2; } // 改变 编码 SOCKET connect_server (char * host, int port); // 连接 服务器 void desconect (SOCKET c) {// 断开 closesocket (c); WSACleanup (); } void recv_ms (SOCKET c) { char text [2000]; strnset (texto, 0, sizeof (texto)); recv (c, texto, 2000, 0); cout << texto << endl << endl; } void send_ms (SOCKET c, char * msg) { send (c, msg, strlen (msg), 0); } correo electrónico de char [200], pas [200]; int main () { host host [] = "smtp.qq.com"; char * pstr = NULL; int puerto = 25; ENCHUFE c; // establece la conexión c = connect_server (host, puerto); // recibe el mensaje recv_ms (c); // envía el mensaje hello send_ms (c, (char *) "helo qq \ r \ n \ 0"); // Informar inicio de sesión recv_ms (c); send_ms (c, (char *) "auth login \ r \ n \ 0"); recv_ms (c); // iniciar sesión cout << "ingresar buzón \ n"; cin >> correo electrónico ; // rcpt a: <[email protected]> char buf [200]; char * a = base64 (correo electrónico); strcat (a, "\ r \ n \ 0"); send_ms (c, a); recv_ms (c); send_ms (c, (char *) "abc \ r \ n \ 0"); // abc significa cifrado en base64 del código de autorización recv_ms (c); // código de autorización memset (buf, 0, sizeof (buf )); sprintf (buf, "correo de: <% s> \ r \ n \ 0", correo electrónico); send_ms (c, buf); desconectar (c); devuelve 0; } SOCKET connect_server (char * host, int port) { WSADATA wd; ENCHUFE c; SOCKADDR_IN saddr; estructura hostent * pHostent; int ret = 0; ret = WSAStartup (MAKEWORD (2, 2), & wd); if (ret! = 0) devuelve 0; c = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); pHostent = gethostbyname (host); saddr.sin_addr.S_un.S_addr = * ((unsigned long *) pHostent-> h_addr_list [0]); // 地址 saddr.sin_family = AF_INET; // ipv4 saddr.sin_port = htons (puerto); // 端口 connect ( c, (SOCKADDR *) y saddr, sizeof (SOCKADDR)); volver c; } //[email protected] //[email protected]
Acabo de aprender que, según el hermano mayor, se llama principalmente la biblioteca, que es importante para comprender la red informática