Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.197.198] |
|
Сообщ.
#1
,
|
|
|
Почему при работе следующего кода, когда идут пакеты, начинает "орать" динамик в системнике?
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 то такого эффекта нет. |
Сообщ.
#2
,
|
|
|
Цитата vtg @ Если не использовать WriteFile то такого эффекта нет. Цитата vtg @ WriteFile(hStdout, (LPCVOID)Buffer, iCount, &dwBytesWritten, 0); здесь на консоль выдается последовательность символов, среди них встречается символ beep ('\b' - кажется) при выводе данного символа на консоль в динамики выдается звуковой сигнал. Видимо среди байтов пакетов встречаются байты со значением равным значению символа beep |
Сообщ.
#3
,
|
|
|
Интересно, не знал. Но странно, что звуковой сигнал выдаётся на каждом пакете. Неужели '\b' или что-то в этом роде встречается в каждом?
|
Сообщ.
#4
,
|
|
|
Ты в файл запиши байты и посмотри, сколько из них "бипов"
|
Сообщ.
#5
,
|
|
|
Цитата Ты в файл запиши байты и посмотри, сколько из них "бипов" А в консоли посмотреть нельзя? Или они там не отображаются? И как точно должен выглядеть этот символ? |
Сообщ.
#6
,
|
|
|
Цитата vtg @ И как точно должен выглядеть этот символ? он никогда не отображается |
Сообщ.
#7
,
|
|
|
Как тогда лучше вывести содержимое пакета на консоль без звука (в HEX и текстовом виде)?
Полагаю, что через printf(wsprintf). Но у меня что-то не получается (толком не умею обращаться с этими функциями). Можно пример? |
Сообщ.
#8
,
|
|
|
Может быть нет смысла отображать непечатаемые символы? Делать дополнительную проверку, если символ в нужном диапазоне - выводить в виде текста. Иначе в Hex. По-моему, делается с помощью %x.
|
Сообщ.
#9
,
|
|
|
Цитата Может быть нет смысла отображать непечатаемые символы? Делать дополнительную проверку, если символ в нужном диапазоне - выводить в виде текста. Иначе в Hex. По-моему, делается с помощью %x. Можно пример? |
Сообщ.
#10
,
|
|
|
Наипростейший вариант:
char InData[SIZE]; // Данные ... { for (int i = 0; i < SIZE; i++) { if (InData[i] > 0x20) { // Можно выводить данный символ, так как он петачаемый } else { // Символы в диапазоне от 0x00 до 0x20 - невидимые // Печатаем hex-значение printf("%x\", InData[i]); } } } Примерно так. |
Сообщ.
#11
,
|
|
|
Зачем в printf("%x\", InData[i]); символ "\"? У меня в MSVS 2008 он отменяет кавычку и получается синтаксическая ошибка.
При работе printf("%x", Buffer[i]); у меня иногда проскакивают восьмизначные числа. Почему? |
Сообщ.
#12
,
|
|
|
Цитата vtg @ Знаковое расширение char в int. Почему? Добавлено лучше всего - изменить декларацию на unsigned char InData[SIZE]; Добавлено P.S. Спецсимволы надо как-то выделять, иначе ты не отличишь группу печатных символов от одного непечатного. |
Сообщ.
#13
,
|
|
|
Следующия функция должна форматировать данные буфера в текст, пропуская "бипы", но прога вылетает.
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]); } } } Что не так? |
Сообщ.
#14
,
|
|
|
Нет, все-таки это непреложная истина - программировать надо начинать с прочтения хороших умных книг.
1) ты уж определись, TCHAR тебе нужен или wchar_t; 2) wsprintf здесь абсолютно не нужен; 3) преобразовывать TCHAR в TCHAR* - естественно работать не будет. |
Сообщ.
#15
,
|
|
|
vtg А чем тебе std::string не угодил?
Цитата vtg @ или в конце концов char или wchar_t зачем Win переопределения юзаеш? LPTSTR lpszBuffer, LPCTSTR lpBuffer |