Забытый протокол от AOL Вольф Данияр Спецвыпуск: Хакер, номер #058, стр. 058-078-4 */ static char *writes(char *buf, const char *data, int len) { memcpy(buf, data, len); return buf+len; } /* Сложная функция по сборке флэп-пакета. Видим, что функция использует простые функции, которые описаны выше: */ static char *flap_begin(char *buf, char frame) { static int seq = 0; buf = writeb(buf, 0x2A); buf = writeb(buf, frame); buf = writew(buf, ++seq); return buf+2; } /* Функция, с помощью которой код вычисляет длину данных, идущих после FLAP (полезный груз), и записывает значение в поле Data Length: */ static char *flap_end(char *buf, char *start) { start -= 2; writew(start, buf-start-2); return buf; } ...................................................... /* Объявляем функции для сборки AIM-пакетов. Я привык писать код в старых традициях (oldschool), поэтому предпочитаю сначала объявить функции, а их описание - после главной программы (main). */ static char *encode_flapsigon(char *buf, const char *screenname); static unsigned char *roast_password(const char *pass); static char *encode_toc_signon(char *buf, const char *screenname, const char *password); static unsigned char *encode_toc_init_done(char *buf); static unsigned char *encode_toc_send_im(char *buf, const char *remscreenname, char *mess); static unsigned char *encode_toc_add_permit(char *buf); static unsigned char *encode_toc_add_deny(char *buf); static unsigned char *encode_toc_set_config(char *buf); static unsigned char *encode_toc_add_buddy(char *buf, const char *screenname); ... /* Функция, которая будет вызываться при прерывании с клавиатуры, например, когда мы пожелаем отправить сообщение сами. */ void onintr(sig){ /* UIN, на который отправим сообщение. Надо заметить, что UIN и screenname для AIM одно и то же. */ char remscreenname[16]; ..................................................... /* Функция для формирования исходящего пакета с текстом, в функцию передаются два аргумента uin и текстовое сообщение. Затем пакет, сформированный тривиальным образом, отправляем на сервер TOC/AIM. */ encode_toc_send_im(buf, remscreenname, messa); i=0; i=ntohs(*((u_int16_t *)(buf+4))); if( send(sock, buf, i+6, 0) == -1 ){perror("Send"); close(sock);} fprintf(stdout,"%s <-- %s\n", remscreenname, messa); /* Дамп сформированного исходящего сообщения. Состоит из заголовка FLAP 6 байт, команды toc_send_im, UIN'а и самого текстового сообщения. */ ... }//Закрываем тело функции прерывания с клавиатуры. int main(int argc, char *argv[]) { ...................................................... //Производим подключение к AIM-сервису if((sock=socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("Socket");} tochost.sin_family=AF_INET; tochost.sin_port=htons(TOC_PORT); tochost.sin_addr=*(struct in_addr *)he->h_addr; bzero(&(tochost.sin_zero), 8); fprintf(stdout, "Connecting TOС server \n"); if( connect(sock, (struct sockaddr *)&tochost, sizeof(struct sockaddr)) == -1 ){perror("Connect");} /* Посылаем первую команду на AIM-сервер, дабы рассказать ему о готовности к работе с ним: */ if( send(sock, FLAPON, sizeof(FLAPON), 0) == -1 |