есть две программы, взаимодействуют по сети. под отладчиком все здорово, но как только происходит отправка одной команды, программа получившая ее вылетает. обработчик этой команды должен получить список сетевых адаптеров на компе и отправить другой программе. пробовал и так как представлено ниже через pcap_findalldevs результат один, без отладчика падает. может кто поможет, о духи интернета? и странность, если между каждой функцией поставить по MessageBox, то все работает=( Код (Text): //глобальные переменные PIP_ADAPTER_INFO pAdapterInfoToDevList; PIP_ADAPTER_INFO pAdapterToDevList = NULL; ULONG len = sizeof(IP_ADAPTER_INFO); //код обработчика memset(pcap_err,0,PCAP_ERRBUF_SIZE); memset(desthostname,0,255); memset(DevList,0,1000); strcpy(desthostname,(strrchr(lpBuffer,' ')+1)); int rslt=WSAEISCONN; strcpy(DevList,"DeviceList!"); if (GetAdaptersInfo( pAdapterInfoToDevList, &len) == ERROR_BUFFER_OVERFLOW) { free(pAdapterInfoToDevList); pAdapterInfoToDevList = (IP_ADAPTER_INFO *) malloc (len); } if ((dwRetVal = GetAdaptersInfo( pAdapterInfoToDevList, &len)) == NO_ERROR) { pAdapterToDevList = pAdapterInfoToDevList; while (pAdapterToDevList!=NULL) { strcat(DevList, pAdapterToDevList->Description); strcat(DevList,"!"); pAdapterToDevList = pAdapterToDevList->Next; } } if(TCP_CreateClient(&client,desthostname,SERVER_PORT_NUM2)) { while(rslt==WSAEISCONN) { if(TCP_ConnectClient(&client)) { if(TCP_Write(&client,DevList,strlen(DevList),&lpNumberOfBytesReadTotal)) { TCP_Disconnect(&client); } } rslt=GetLastError(); } TCP_Close(&client); }
Первое, что я делаю в таких случаях -- дизассемблирую код ф-ии "вокруг" eip на момент падения. Обычно все сразу встает на свои места.
Код (Text): while(rslt==WSAEISCONN) { if(TCP_ConnectClient(&client)) { if(TCP_Write(&client,DevList,strlen(DevList),&lpNumberOfBytesReadTotal)) { TCP_Disconnect(&client); } } rslt=GetLastError(); } а зачем в цикле отправка? что ты этим хочешь добиться? и покажи строки внутри ф-й TCP_
Это код не мой, это моего друга, это просто дождаться полного выполнения функции насколько я помню. файл приложил. но Падает гдето до отправки в обратную сторону
Кхм. Нужен не этот код. Нужен код обработки полученной команды. Напоминает все это, что вы забываете что-то при обработке, вызывается тот же обработчик 2-й раз (!), переменные глобальные, происходит free(pAdapterInfoToDevList) во втором вызове обработчика, в то время как первый еще активен с циклом. Ну и немедленный вылет. Под отладчиком, который стопорит все пошагово, все работает. А в реальных условиях - ошибка доступа к памяти, или что-то такое. Короче, "выполнила недопустимую операцию и будет закрыта"
я бы тупо добавил 1 глобальную переменную, изначально заданную в True, а потом в начале обработки злосчастной команды if (flag_var==true) { flag_var=false; ... (А тут весь приведенный в #0 обработчик) ... flag_var=true; } Если прокатит, значит я прав и надо искать багу с вызовами.
Это второй, которым я управляю, вот в нем слева надо выделить Localhost и нажать получить список адаптеров
это и был весь код обработчика=( начиная от memset И дальше до конца и двойных вызовов там по архитектуре быть не может=(
Вы точно ЗНАЕТЕ, что не может, или вы ДУМАЕТЕ, что не должно? там окно есть? Окно или диалоговая форма? Вот это получение списка адаптеров - оно где расположено? как реакция на кнопку, или на какое-то сообщение, или по таймеру, после проверки на что-то?
Там есть диалогавая форма, как интерфейс, для работы с сетью я создал совершенно отдельный поток, и получение списка адаптеров в этом отдельном потоке, и из него никуда не выходит и не передает управление.
Код (Text): --------------------------- drv_client.exe - Не удалось найти компонент --------------------------- Приложению не удалось запуститься, поскольку packet.dll не был найден. Повторная установка приложения может исправить эту проблему. --------------------------- ОК --------------------------- Код (Text): --------------------------- E:\NetClient.exe --------------------------- E:\NetClient.exe Приложение не было запущено, поскольку оно некорректно настроено. Повторная установка приложения может решить данную проблему. --------------------------- ОК ---------------------------
да, пробовал, pcap_findalldevs, вылетало, попробовал заменить на GetAdaptersInfo, все равно летит=(. Там в программе есть простенький сетевой сниффер на WinPcap
Так в чем проблема посмотреть в дизассемблере инструкции по адресу падения? Давно бы все стало понятно...