Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > C/C++: Сетевое программирование > Орущий снифер |
Автор: vtg 21.06.09, 17:09 |
Почему при работе следующего кода, когда идут пакеты, начинает "орать" динамик в системнике? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> void ShowNetwork(HANDLE hStdout) // hStdout - Хэндл командной строки { char Buffer[MAX_PACKET_SIZE]; // Буфер для приёма данных, 64 Kb WSADATA lpWSAData; // Инициализация WinSock SOCKET s; // Cлущающий сокет CHAR szHostName[MAX_PATH]; // Имя хоста (компьютера) HOSTENT* pHost; // Информация о хосте SOCKADDR_IN sa; // Адрес хоста IN_ADDR sa1; // unsigned long flag = 1; // Флаг PROMISC Вкл/выкл DWORD dwBytesWritten; // инициализация if (WSAStartup(MAKEWORD(2, 2), &lpWSAData)==0) { s = socket(AF_INET, SOCK_RAW, IPPROTO_IP); gethostname(szHostName, sizeof(szHostName)); pHost = gethostbyname(szHostName); ZeroMemory(&sa, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = ((struct in_addr *)pHost->h_addr_list[0])->s_addr; bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR)); // Включение promiscuous mode ioctlsocket(s, SIO_RCVALL, &flag); // Бесконечный цикл приёма IP-пакетов while (1 > 0) { int iCount = recv(s,Buffer,65536,0); WriteFile(hStdout, (LPCVOID)Buffer, iCount, &dwBytesWritten, 0); printf("\n"); // next line } //Off flag = 0; ioctlsocket(s, SIO_RCVALL, &flag); closesocket(s); WSACleanup(); } Если не использовать WriteFile то такого эффекта нет. |
Автор: impik777 21.06.09, 17:24 |
здесь на консоль выдается последовательность символов, среди них встречается символ beep ('\b' - кажется) при выводе данного символа на консоль в динамики выдается звуковой сигнал. Видимо среди байтов пакетов встречаются байты со значением равным значению символа beep |
Автор: vtg 21.06.09, 17:35 |
Интересно, не знал. Но странно, что звуковой сигнал выдаётся на каждом пакете. Неужели '\b' или что-то в этом роде встречается в каждом? |
Автор: Core 22.06.09, 05:33 |
Ты в файл запиши байты и посмотри, сколько из них "бипов" |
Автор: vtg 22.06.09, 15:01 |
Цитата Ты в файл запиши байты и посмотри, сколько из них "бипов" А в консоли посмотреть нельзя? Или они там не отображаются? И как точно должен выглядеть этот символ? |
Автор: impik777 22.06.09, 15:06 |
он никогда не отображается |
Автор: vtg 22.06.09, 18:08 |
Как тогда лучше вывести содержимое пакета на консоль без звука (в HEX и текстовом виде)? Полагаю, что через printf(wsprintf). Но у меня что-то не получается (толком не умею обращаться с этими функциями). Можно пример? |
Автор: Waltz 22.06.09, 18:29 |
Может быть нет смысла отображать непечатаемые символы? Делать дополнительную проверку, если символ в нужном диапазоне - выводить в виде текста. Иначе в Hex. По-моему, делается с помощью %x. |
Автор: vtg 24.06.09, 18:24 |
Цитата Может быть нет смысла отображать непечатаемые символы? Делать дополнительную проверку, если символ в нужном диапазоне - выводить в виде текста. Иначе в Hex. По-моему, делается с помощью %x. Можно пример? |
Автор: Waltz 24.06.09, 19:35 |
Наипростейший вариант: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> char InData[SIZE]; // Данные ... { for (int i = 0; i < SIZE; i++) { if (InData[i] > 0x20) { // Можно выводить данный символ, так как он петачаемый } else { // Символы в диапазоне от 0x00 до 0x20 - невидимые // Печатаем hex-значение printf("%x\", InData[i]); } } } Примерно так. |
Автор: vtg 27.06.09, 20:16 |
Зачем в printf("%x\", InData[i]); символ "\"? У меня в MSVS 2008 он отменяет кавычку и получается синтаксическая ошибка. При работе printf("%x", Buffer[i]); у меня иногда проскакивают восьмизначные числа. Почему? |
Автор: trainer 29.06.09, 06:50 |
Знаковое расширение char в int. Добавлено лучше всего - изменить декларацию на <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> unsigned char InData[SIZE]; Добавлено P.S. Спецсимволы надо как-то выделять, иначе ты не отличишь группу печатных символов от одного непечатного. |
Автор: vtg 30.06.09, 22:52 |
Следующия функция должна форматировать данные буфера в текст, пропуская "бипы", но прога вылетает. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> void DataToText(LPTSTR lpszBuffer, LPCTSTR lpBuffer, int iSizeBuffer) { for (int i = 0; i < iSizeBuffer; i++) { if (lpBuffer[i] != 0x07) //0x07 is beep { wsprintf((LPTSTR)lpszBuffer[i], _T("%c"), lpBuffer[i]); } } } Что не так? |
Автор: trainer 01.07.09, 05:28 |
Нет, все-таки это непреложная истина - программировать надо начинать с прочтения хороших умных книг. 1) ты уж определись, TCHAR тебе нужен или wchar_t; 2) wsprintf здесь абсолютно не нужен; 3) преобразовывать TCHAR в TCHAR* - естественно работать не будет. |
Автор: D.S 02.07.09, 11:23 |
vtg А чем тебе std::string не угодил? или в конце концов char или wchar_t зачем Win переопределения юзаеш? |