Сокеты...

Все вопросы, связанные с программированием

Модератор: Злобные админы

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сокеты...

Сообщение AL » Пт, 13.10.2006 15:41

При получении файла размер которого больше ~2.1Mb вот таким образом прога просто-напросто вылетает! Если файл меньше - никаких проблем.
Может кто-нибудь знает в чем дело? Поделитесь мыслями, заранее благодарен.

Код: Выделить всё

SC:LongWord;
Buf: array[1..BufSize] of Byte;
FlT:File;
       ...
       ReWrite (FlT, 1);
        ...
       SC:=0;
        ...
      AC:=ClientSocket.Socket.ReceiveBuf(Buf, BufSize);
      if AC>0 then
       begin
        BlockWrite (FlT, Buf, AC);       
        Inc(SC,AC);
           ...
       end;
     until SC>=FSize;
Изображение
Изображение

Аватара пользователя
vag
из зажрамшихся
Сообщения: 577
Зарегистрирован: Пт, 13.02.2004 18:50
Откуда: физ.-мат. деревня Глазов

Сообщение vag » Пт, 13.10.2006 23:34

приведенных участков кода недостаточно,
однако, если судить по дампу, твоя программа пыталась обратиться к "чужой" памяти, что и вызвало ошибку защиты
С уважением,
Vladimir Gerasimov (aka vag)

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Сб, 14.10.2006 13:33

То есть, если продолжить гадание ;), отведенный участок памяти под буфер недостаточен и при превышении оного, искомые ~2,1 Мб, осуществляется попытка занять под переменную уже занятый участок памяти. Хех. Видимо в ходе инициализации исполняемого процесса существующие настройки недостаточны для его полноценной работы. Хихик, но кажись автор ап этом тожи знаит. :mrgreen:
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сообщение AL » Пн, 16.10.2006 16:58

С этим делом разобрался - Application.ProcessMessages; был
причиной... а может вся эта организация...

Код: Выделить всё

      repeat
      AC:=ClientSocket.Socket.ReceiveBuf(Buf, BufSize); 
      if AC>0 then 
       begin 
        BlockWrite (FlT, Buf, AC);        
        Inc(SC,AC); 
           ... 
       end; 
====>Application.ProcessMessages;
     until SC>=FSize;
Участок кода переписан.

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сообщение AL » Пн, 16.10.2006 17:13

и снова проблемы... с асинхронным режимом...
Написать обработчик событий FD_Read, FD_Accept, FD_Close если проге есть форма не так уж трудно, а как быть если в программе нет этой самой формы и вообще никаких визуальных компонентов?
Не понятно что передавать функции WSAAsyncSelect в качестве второго параметра (хэндл окна).

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Пн, 16.10.2006 17:21

Если трабла только в этом, то создай прозрачное окно или за пределами рабочего стола.
Кроме того попробуй передать хэндл процесса:

Код: Выделить всё

// Получение снимка состояния системы
hSnapshot := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
// Получене инфоpмации о пеpвом пpоцессе в списке
Process32First();
// Получение инфоpмации о следующем пpоцессе в списке
Далее в цикле Process32Next();
Это просто где можно поискать. И хва увлекаться вирями. ;) Есть более конструктивная область приложения в том числе и твоего интеллекта. :)
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сообщение AL » Пн, 16.10.2006 17:31

Если трабла только в этом, то создай прозрачное окно или за пределами рабочего стола.
Неа... окон создавать не хочу.
И хва увлекаться вирями.
Хе... с чего ты взял? Просто нужно написать простой сервер.
Есть более конструктивная область приложения в том числе и твоего интеллекта.
Дааа? Ну-ка, ну-ка освети эту область. Небось философия?

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Пн, 16.10.2006 17:39

AL писал(а):Неа... окон создавать не хочу.
Хочу-нехочу; задача стояла: что передать в качестве хендла окна. :)
AL писал(а):Хе... с чего ты взял? Просто нужно написать простой сервер.
Да, да, прооостенький такой, штоп он чисто слушал один порт и по ctrl+alt+del под 95/98-м ничем не выдавал своего присутствия и периадичиски коя што передавал по запросу "клиента" :lol: .
AL писал(а):Дааа? Ну-ка, ну-ка освети эту область. Небось философия?
Та ну иё ф пень эту пиласофийу. Если по теме, то например распеделенные вычисления для моделирования физических процессов в реальном времени. И не надо при этом прятать сервер из списка окон. ;)
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сообщение AL » Пн, 16.10.2006 18:05

Destion писал(а):Хочу-нехочу задача стояла: что передать в качестве хендла окна.
Ищем другои вариант.
Destion писал(а):Да, да, прооостенький такой, штоп он чисто слушал один порт и по ctrl+alt+del под 95/98-м ничем не выдавал своего присутствия и периадичиски коя што передавал по запросу "клиента"
Сделать это будет просто, точнее сделано...
Destion писал(а): Если по теме, то например распеделенные вычисления для моделирования физических процессов в реальном времени. И не надо при этом прятать сервер из списка окон.
Из списка окон ничего прятать не надо - просто их не надо создавать.
Ну а чтобы организовать хоть какие-нибудь параллельные вычисления нужен как раз похожий сервачок.

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Пн, 16.10.2006 18:11

Ищи, Тузик, ищи. Мне например DelphiWorld в поисках помогает. :)

Ну а для того чтобы управлять сервачком нужен интерфейс, и желательно - графический, иначе управление грозит превратиться в гимор с постоянными трассировками кода. Вощем окошко треба ну или хотя-бы в трей иконку с попап менюшкой. :)
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сообщение AL » Пн, 16.10.2006 18:17

Destion писал(а):Ищи, Тузик, ищи. Мне например DelphiWorld в поисках помогает. :)
DelphiWorld, батенька, пока ничего дельного не сказал. Может быть я его не так пытаю. :shock:
Destion писал(а):Ну а для того чтобы управлять сервачком нужен интерфейс, и желательно - графический, ...
Дых... речь идёт о сервере, а не о клиенте (с ним-то пока все в порядке).

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Пн, 16.10.2006 18:28

Ну ты лентяй :D. Вот что мне выдал DW при поиске текста WSAAsyncSelect, вощем мон поражён.:mrgreen:

Код: Выделить всё

Что нужно давать WSAAsyncSelect в качестве параметра handle 
--------------------------------------------------------------------------------

Автор: Nomadic 

Что нужно давать WSAAsyncSelect в качестве параметра handle, если тот запускается и используется в dll (init), и никакой формы (у которой можно было бы взять этот handle) в этой dll не создается? 

const
  WM_ASYNCSELECT = WM_USER + 0;

type
  TNetConnectionsManager = class(TObject)
  protected
    FWndHandle: HWND;
    procedure WndProc(var MsgRec: TMessage);
    ...
  end;

constructor TNetConnectionsManager.Create
begin
  inherited Create;
  FWndHandle := AllocateHWnd(WndProc);
  ...
end;

destructor TNetConnectionsManager.Destroy;
begin
  ...
    if FWndHandle <> 0 then
    DeallocateHWnd(FWndHandle);
  inherited Destroy;
end;

procedure TNetConnectionsManeger.WndProc(var MsgRec: TMessage);
begin
  with MsgRec do
    if Msg = WM_ASYNCSELECT then
      WMAsyncSelect(MsgRec)
    else
      DefWindowProc(FWndHandle, Msg, wParam, lParam);
end;

Hо pекомендую посмотpеть WinSock2, в котоpом можно:

WSAEventSelect( FSocket, FEventHandle, FD_READ or FD_CLOSE );
WSAWaitForMultipleEvents( ... );
WSAEnumNetworkEvents( FSocket, FEventHandle, lpNetWorkEvents );

То есть, обойтись без окон и без очеpеди сообщений windows, а заодно иметь возможность pаботать и с IPX/SPX, и с netbios. 
 
Проект Delphi World © Выпуск 2002 - 2004 
Автор проекта: ___Nikolay 
 
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сообщение AL » Пн, 16.10.2006 18:38

Йэх... лентяй-не лентяй, но это найдено давно... вот только "прикрутить" пока не получается.

"Изучаем" *Event* - содержащие функции...

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Пн, 16.10.2006 18:41

Ну эт уже не ко мне. ;) Не я ведь сервер ваяю, тем более свой я уже тыщу лет назад замостырил. :lol: А пользовал для взлома пароля. :D И ни каких проблем. ;)
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сообщение AL » Пн, 16.10.2006 18:49

Ну тады просвети меня неучёного, как лучше сделать.
Свой-то небось на каких-нибудь TServerSocket/TClientSocket "замостырил".

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Пн, 16.10.2006 18:56

Неа, на IdTCPServer - штучка изумительная. Я балдел когда кодил, всего час делов и готовый сервак. :D Читай доки по компоненту, он в палитре есть. ;) Копаться в собственной памяти лень - пиво стынет. :mrgreen:
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Аватара пользователя
AL
Старшекурсник
Сообщения: 361
Зарегистрирован: Чт, 13.04.2006 08:20

Сообщение AL » Пн, 16.10.2006 19:03

Пасиба...
... однако лишние 50 кб после компиляции ставят под вопрос его использование. :wink:

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Пн, 16.10.2006 19:06

Начит маскируй под чтонить дельное типа скринсейвер. ;)
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Аватара пользователя
il
Ленивое существо
Сообщения: 277
Зарегистрирован: Пт, 13.02.2004 17:57

Сообщение il » Вт, 17.10.2006 07:50

Destion писал(а): Если по теме, то например распеделенные вычисления для моделирования физических процессов в реальном времени. И не надо при этом прятать сервер из списка окон. ;)
Вот-вот, можно об этом поподробнее. Есть ли опыт в создании распределенных вычислений. А то хотелось был лабочку создать по параллельному программированию на эту тему.

Аватара пользователя
Destion
Дипломник
Сообщения: 544
Зарегистрирован: Ср, 14.06.2006 17:47

Сообщение Destion » Вт, 17.10.2006 09:58

Да нет, у меня была задача по взлому пароля одного запароленного rar-архива ну я написал сервачок, и клиент к нему. Взламывал по словарю. Клиенты отправляли серверу запрос на очередную порцию паролей и сервер отсылал еще не проверенные записи из словаря если пароль находился сервак останавливался с выдачей этого самого пароля и имени машины на котором все стало известно ;). Так вот, раскидал копии архива с клиентами по машинам в классе и осуществил распределенную атаку на архив по словарю. :D Вооот, а для моделирования физических процессов нужно распределять вычисления характеристик по тем же машинам в зависимости от времени например, чтобы сервер получал уже вычисленные величины. Ну например делить секунду на 10 частей и каждый клиент, получив определенную функцию, вычисляет десять значений функции в зависимости от времени, полученные результаты отправляет на сервак. Сервак же в свою очередь тупо подставляет полученные величины для отображения процесса. Вощем пока все пашут, сервер занимается рисованием. :mrgreen:
1 Терапевт - это 1024 Гигапевта или 1048576 Мегапевтов.

Ответить