Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата vtg @
Если не использовать WriteFile то такого эффекта нет.


Цитата vtg @
WriteFile(hStdout, (LPCVOID)Buffer, iCount, &dwBytesWritten, 0);

здесь на консоль выдается последовательность символов,
среди них встречается символ 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 @
И как точно должен выглядеть этот символ?

он никогда не отображается

Автор: 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
Цитата vtg @
Почему?
Знаковое расширение 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 не угодил?
Цитата vtg @
LPTSTR lpszBuffer, LPCTSTR lpBuffer
или в конце концов char или wchar_t зачем Win переопределения юзаеш?

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)