нагибаем AOL/MSN ВОЛЬФ ДАНИЯР AKA PAYHASH Спецвыпуск: Хакер, номер #063, стр. 063-108-2 ну-с, приступим! Итак, для простоты будем использовать протокол TOC(AIM) от America Online Inc. В 59-м номере Спеца я приводил пример кода для UNIX-систем (BSD, Linux), поэтому сейчас ради разнообразия приведу пример под win32-системы. Конечно, я не могу привести полный пример, поэтому: а) полезем на полку и поищем там замусоленный и запыленный 58-й номер; б) побежим в журнальный ларек и спросим, не завалялся ли там сентябрьский номер Спеца за 2005 год ;). Открываешь номер и смотришь, что можно заменить или добавить, чтобы этот пример работал в win32-системе. Можно оперировать с помощью директив включения типа: #if win32 /* some any defined code */ #endif В прошлом примере мы включали заголовки типа: #include<stdio.h> #include<string.h> #include<sys/types.h> #include<signal.h> #include<netinet/in.h> #include<sys/socket.h> #include<netdb.h> #include<sys/errno.h> Заменим их на один универсальный заголовок: #include<winsock2.h> Для того чтобы типы данных UNIX-подобных систем были совместимы с типами данных win32-систем, осуществим небольшое типовое преобразование просто добавив преобразователь typedef: typedef BYTE u_int8_t; typedef WORD u_int16_t; typedef DWORD u_int32_t; До функции main() больше ничего не трогаем. Теперь в теле функции main() снова сделаем некоторые добавления и включения для работы с сетевыми вызовами в win32-системе — объявим следующие переменные: WSADATA WSAData; BOOL flag; Далее объявляем аргументы, необходимые для работы нашей программы (буферы, файловые и сетевые дескрипторы, временные переменные). Для того чтобы вызывать сетевые функции, делаем следующий вызов: WSAStartup — в противном случае не будут работать функции типа gethostbyname, socket, connect, bind, etс. Делаем вот таким образом: if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) { //Здесь возвращаем ошибку или иное программное событие ;). } Сразу замечу, что для nix-систем нет различий между дескриптором сети и дескриптором файла, а для Windows, похоже, есть. Так что вместо close() нужно применять closesocket(). Подключившись к TOC(AIM)-серверу (для этого — пройти несложную авторизацию на сервисе TOC и установить статус online или другие), ты должен быть извещен о том, что система готова принимать входящие команды, — поступим примерно так (сразу вспоминаем 59-й номер): /* Из памяти динамически выделяем место для двух переменных, общий буфер и текстовое сообщение с оповещением, к примеру: READY TO EXECUTE COMMAND. */ buf=(char *)malloc(256, sizeof(char )); |