Забытый протокол от AOL Вольф Данияр Спецвыпуск: Хакер, номер #058, стр. 058-078-5 ){perror("Send"); close(sock);} /* Принимаем ответ с сервера в виде пакета FLAP SIGNON: */ if( recv(sock, buffer, 2048, 0) == -1){perror("RECV"); close(sock);} /* Составляем ответ для сервера в виде пакета TOC SIGNON, для этого динамически выделяем память. При этом используем указатель buf. После этого отправляем пакет на сервер, используя функцию send. Надо отметить, что аргументы i и j фигурируют для определения размера поля VALID DATA. */ buf=(char *)malloc(256*sizeof(char )); encode_flapsigon(buf, screenname); i=0; i=ntohs(*((u_int16_t *)(buf+4))); if( send(sock, buf, i+6, 0) == -1 ){perror("Send"); close(sock);} free(buf); /* Далее следует аутентификация на сервере - формируем пакет toc_signon с помощью функции encode_toc_signon. В параметрах передаем указатель на адрес буфера, наш ICQ uin/AIM screename и пароль к нему: */ buf=(char )malloc(256*sizeof(char )); encode_toc_signon(buf, screenname, password); i=0; i=ntohs(*((u_int16_t *)(buf+4))); if( send(sock, buf, i+6, 0) == -1 ){perror("Send"); close(sock);} ... На этом участке кода мы немного схитрим для повышения производительности кода. В противном случае придется несколько раз использовать функцию send. Если внимательно посмотреть на него, можно заметить, что в одну строку buf мы формируем сразу несколько пакетов TOC, каждый раз смещая указатель на буфер. Это делается для экономии времени подключения к серверу, избавления от повторяющихся участков кода и, конечно же, для эстетики ;). Поехали. encode_toc_add_permit, encode_toc_add_deny, encode_toc_set_config, encode_toc_add_buddy, encode_toc_set_config, encode_toc_init_done. Интересно, что функцию encode_toc_init_don мы вызываем в конце - так требует стандарт. Конечно, можно разделить все и по частям. */ //toc_add_permit - устанавливаем список разрешенных пользователей encode_toc_add_permit(buf); i=0; i=ntohs(*((u_int16_t *)(buf+4))); /* toc_add_deny - устанавливаем список запрещенных пользователей */ encode_toc_add_deny(buf+i+6); j=0; j=ntohs(*((u_int16_t *)((buf+i+6)+4))); i=i+j; //toc_set_config //Устанавливаем contact list encode_toc_set_config(buf+i+12); j=0; j=ntohs(*((u_int16_t *)((buf+i+12)+4))); i=i+j; /* toc_add_buddy - добавляем себя в contact list и организуем статус online */ encode_toc_add_buddy((buf+i+18), screenname); j=0; j=ntohs(*((u_int16_t *)((buf+i+18)+4))); i=i+j; //toc_set_config encode_toc_set_config(buf+i+24); j=0; j=ntohs(*((u_int16_t *)((buf+i+24)+4))); i=i+j; //toc_init_done - подтверждаем, что пройдена процедура авторизации encode_toc_init_done(buf+i+30); j=0; j=ntohs(*((u_int16_t *)((buf+i+30)+4))); i=i+j; if( send(sock, buf, i+36, 0) == -1 ){perror("Send"); close(sock);} free(buf); puts("Now you connect on the TOC server"); puts("Press ctrl+c you menu"); buf=(char )malloc(256*sizeof(char )); mess=(char )malloc(128*sizeof(char )); signal (SIGINT, onintr); Уходим в главный цикл нашей программы, переводя программу в режим приема сообщений до тех пор, пока аргумент messa не станет равным "quit", после чего программа выйдет из цикла и завершится: while(memcmp(messa, "quit", 4)) { ................................................ |