Вылетает программа

Тема в разделе "WASM.WIN32", создана пользователем drem1lin, 22 апр 2010.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    есть две программы, взаимодействуют по сети. под отладчиком все здорово, но как только происходит отправка одной команды, программа получившая ее вылетает. обработчик этой команды должен получить список сетевых адаптеров на компе и отправить другой программе. пробовал и так как представлено ниже через pcap_findalldevs результат один, без отладчика падает. может кто поможет, о духи интернета? и странность, если между каждой функцией поставить по MessageBox, то все работает=(
    Код (Text):
    1. //глобальные переменные
    2. PIP_ADAPTER_INFO pAdapterInfoToDevList;
    3. PIP_ADAPTER_INFO pAdapterToDevList = NULL;
    4. ULONG len = sizeof(IP_ADAPTER_INFO);
    5. //код обработчика
    6. memset(pcap_err,0,PCAP_ERRBUF_SIZE);
    7.                                 memset(desthostname,0,255);
    8.                                 memset(DevList,0,1000);
    9.                                 strcpy(desthostname,(strrchr(lpBuffer,' ')+1));
    10.                                 int rslt=WSAEISCONN;
    11.                                 strcpy(DevList,"DeviceList!");
    12.                                 if (GetAdaptersInfo( pAdapterInfoToDevList, &len) == ERROR_BUFFER_OVERFLOW) {
    13.                                     free(pAdapterInfoToDevList);
    14.                                     pAdapterInfoToDevList = (IP_ADAPTER_INFO *) malloc (len);
    15.                                 }
    16.                                 if ((dwRetVal = GetAdaptersInfo( pAdapterInfoToDevList, &len)) == NO_ERROR)
    17.                                 {
    18.                                     pAdapterToDevList = pAdapterInfoToDevList;
    19.                                     while (pAdapterToDevList!=NULL)
    20.                                     {
    21.                                         strcat(DevList, pAdapterToDevList->Description);
    22.                                         strcat(DevList,"!");
    23.                                         pAdapterToDevList = pAdapterToDevList->Next;
    24.                                     }
    25.                                 }
    26.                                 if(TCP_CreateClient(&client,desthostname,SERVER_PORT_NUM2))
    27.                                 {
    28.                                     while(rslt==WSAEISCONN)
    29.                                     {
    30.                                         if(TCP_ConnectClient(&client))
    31.                                         {
    32.                                             if(TCP_Write(&client,DevList,strlen(DevList),&lpNumberOfBytesReadTotal))
    33.                                             {
    34.                                                 TCP_Disconnect(&client);
    35.                                             }
    36.                                         }
    37.                                         rslt=GetLastError();
    38.                                     }
    39.                                     TCP_Close(&client);
    40.                                 }
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Первое, что я делаю в таких случаях -- дизассемблирую код ф-ии "вокруг" eip на момент падения. Обычно все сразу встает на свои места.
     
  3. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Код (Text):
    1. while(rslt==WSAEISCONN)
    2.                                     {
    3.                                         if(TCP_ConnectClient(&client))
    4.                                         {
    5.                                             if(TCP_Write(&client,DevList,strlen(DevList),&lpNumberOfBytesReadTotal))
    6.                                             {
    7.                                                 TCP_Disconnect(&client);
    8.                                             }
    9.                                         }
    10.                                         rslt=GetLastError();
    11.                                     }
    а зачем в цикле отправка? что ты этим хочешь добиться?
    и покажи строки внутри ф-й TCP_
     
  4. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Это код не мой, это моего друга, это просто дождаться полного выполнения функции насколько я помню. файл приложил. но Падает гдето до отправки в обратную сторону
     
  5. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Кхм. Нужен не этот код. Нужен код обработки полученной команды. Напоминает все это, что вы забываете что-то при обработке, вызывается тот же обработчик 2-й раз (!), переменные глобальные, происходит free(pAdapterInfoToDevList) во втором вызове обработчика, в то время как первый еще активен с циклом. Ну и немедленный вылет. Под отладчиком, который стопорит все пошагово, все работает. А в реальных условиях - ошибка доступа к памяти, или что-то такое. Короче, "выполнила недопустимую операцию и будет закрыта"
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    я бы тупо добавил 1 глобальную переменную, изначально заданную в True, а потом в начале обработки злосчастной команды

    if (flag_var==true) {
    flag_var=false;
    ...
    (А тут весь приведенный в #0 обработчик)
    ...
    flag_var=true;
    }
    Если прокатит, значит я прав и надо искать багу с вызовами.
     
  7. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Бинарник зааттачить можешь?
     
  8. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    это тот который вылетает.
     
  9. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Это второй, которым я управляю, вот в нем слева надо выделить Localhost и нажать получить список адаптеров
     
  10. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    это и был весь код обработчика=( начиная от memset И дальше до конца и двойных вызовов там по архитектуре быть не может=(
     
  11. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Чет я его (бинарника) не наблюдаю
     
  12. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    ^^^^^^^^^^
     
  13. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Вы точно ЗНАЕТЕ, что не может, или вы ДУМАЕТЕ, что не должно? там окно есть? Окно или диалоговая форма? Вот это получение списка адаптеров - оно где расположено? как реакция на кнопку, или на какое-то сообщение, или по таймеру, после проверки на что-то?
     
  14. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Там есть диалогавая форма, как интерфейс, для работы с сетью я создал совершенно отдельный поток, и получение списка адаптеров в этом отдельном потоке, и из него никуда не выходит и не передает управление.
     
  15. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Код (Text):
    1. ---------------------------
    2. drv_client.exe - Не удалось найти компонент
    3. ---------------------------
    4. Приложению не удалось запуститься, поскольку packet.dll не был найден. Повторная установка приложения может исправить эту проблему.
    5. ---------------------------
    6. ОК  
    7. ---------------------------
    Код (Text):
    1. ---------------------------
    2. E:\NetClient.exe
    3. ---------------------------
    4. E:\NetClient.exe
    5.  
    6.  
    7.  
    8. Приложение не было запущено, поскольку оно некорректно настроено. Повторная установка приложения может решить данную проблему.
    9.  
    10.  
    11. ---------------------------
    12. ОК  
    13. ---------------------------
     
  16. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Это ошибка связана с WinPcap, на компьютере он должен быть установлен
     
  17. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    ой, ты что что бы получить список адаптеров ВинПкап юзаешь??????
     
  18. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    да, пробовал, pcap_findalldevs, вылетало, попробовал заменить на GetAdaptersInfo, все равно летит=(. Там в программе есть простенький сетевой сниффер на WinPcap
     
  19. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Так в чем проблема посмотреть в дизассемблере инструкции по адресу падения? Давно бы все стало понятно...