Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с сокетами, в dll непонятно работают 
:(
    Опции темы
Racer
  Дата 29.6.2010, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Пробую использовать Сокеты в своих длл. Одна длл для сервера другая для клиента. вызываются функи из длл из другого языка- MQL4(это язык для роботов в MT4). 
Вопрос в следующем: когда клиент соединяется с сервером я это событие показываю в мессаге и посылаю клиенту условный код - 777- типа что мы соединены. затем с определенной периодичностью вызываю функу write(s: integer) из сервера и так же read:integer из клиента. то есть если в сокет сервак еще не писал то реад возвращает 777 (или 555 при не соединении). 1 раз при соединении они данными обменялись. но потом вызываю райт и клиент не получает новые данные. в чем загвоздка? а и еще... после обмена данными при соединении кол-во клиентов сервак показывает  0. получается что клиент сам отсоединился, или как?
PM MAIL   Вверх
kami
Дата 29.6.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Ничего не понятно.
Выдержки из кода:
- создания
- соединения
- обмена информацией
в студию.

Добавлено через 1 минуту и 45 секунд
Цитата(Racer @  29.6.2010,  00:24 Найти цитируемый пост)
получается что клиент сам отсоединился, или как?

TCPView в помощь
PM MAIL WWW   Вверх
Racer
Дата 29.6.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Код сейчас приложу. за программу спасибо.


Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  Source.txt 4,46 Kb
PM MAIL   Вверх
Racer
  Дата 30.6.2010, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



меня никто не спасет?  smile 
PM MAIL   Вверх
kami
Дата 1.7.2010, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(Racer @  30.6.2010,  20:03 Найти цитируемый пост)
меня никто не спасет?

Пока - извините, нет времени.
Код не особо (или особо не) понравился, но навскидку - пойдет.
почему Вам не соорудить тестовое приложение и прогнать эти библиотеки в нем?
PM MAIL WWW   Вверх
Racer
Дата 1.7.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



я соорудил. оно все работает. проблема только когда я их использую в MetaTrader4. тогда оно не работает. а а утилита марка руссиновича говорит что соединение есть. могу приложить еще коды роботов МТ4, если надо.
PM MAIL   Вверх
Демо
Дата 3.7.2010, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



Racer

Для нормальной работы в DLL (а также в доп. потоке) для этих компонент должна быть организована очередь выборки сообщений.
Кроме того, чем оправдано использование ShowMessage в DLL?


--------------------
    
PM MAIL ICQ Skype   Вверх
kami
Дата 4.7.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(Демо @  3.7.2010,  19:21 Найти цитируемый пост)
Для нормальной работы в DLL (а также в доп. потоке) для этих компонент должна быть организована очередь выборки сообщений.

Про доп.поток - согласен, а вот основной (и без разницы - dll или нет, адресное пространство одно) тут ни при чем - в нем итак организована очередь, в основном приложении. Иначе - в stNonBlocking не работала бы отправка/прием данных.

Добавлено через 4 минуты и 44 секунды
Цитата(Racer @  1.7.2010,  10:26 Найти цитируемый пост)
а а утилита марка руссиновича говорит что соединение есть.

если приложен полный код dll, то у меня есть бредовое предоположение - основная программа самостоятельно выгружает dll, в результате чего само соединение остается (его же никто не уничтожал, код dllMain отсутсвует), а вот вновь подгруженные экземпляры dll само собой ничего о "предыдущем" коннекте не знают.
сделай dllMain и снабди код дллок текстовым логом.

Цитата(Racer @  1.7.2010,  10:26 Найти цитируемый пост)
 коды роботов МТ4, 

Что за звери?

Это сообщение отредактировал(а) kami - 4.7.2010, 19:24
PM MAIL WWW   Вверх
Демо
Дата 4.7.2010, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



Цитата(kami @  4.7.2010,  19:23 Найти цитируемый пост)
тут ни при чем - в нем итак организована очередь, в основном приложении. Иначе - в stNonBlocking не работала бы отправка/прием данных.


Может быть.
Отправка и приём данных и так будет работать - без разницы - в DLL или доп. потоке.
А вот события построены на сообщениях.
Просто я усомнился, что правильно будет обрабатываться, так как TApplication отличаются в DLL и основном приложении.


--------------------
    
PM MAIL ICQ Skype   Вверх
Racer
Дата 13.7.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



1) Showmessage я сделал для отладки, что бы видет что там происходит.
2) мне тоже кажеться, что MetaTrader как то сам разрывает соединение.  Как проверить так ли это?
3) Роботы MT4 это советники, которые сами торгуют на рынке Форекс через платформу MT4 smile

Это из справки терминала :
Цитата

Для импорта функций во время выполнения mql4-программы используется так называемое позднее связывание. Это значит, что пока не вызвана импортируемая функция, соответствующий модуль (ex4 или dll) не загружается. Библиотеки MQL4 и DLL выполняются в потоке вызывающего модуля.

Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive:\Directory\FileName.Ext. Библиотеки MQL4 загружаются из папки terminal_dir\experts\libraries. Если библиотека не была найдена, то производится попытка загрузить библиотеку из папки terminal_dir\experts.

Системные библиотеки (DLL) загружаются по правилам операционной системы. Если библиотека уже загружена (например, другим экспертом и даже из другого клиентского терминала, запущенного параллельно), то обращение идет к уже загруженной библиотеке. В противном случае поиск идет в следующей последовательности:
1. Директория terminal_dir\experts\libraries.
2. Директория, из которой запущен клиентский терминал terminal_dir.
3. Текущая директория.
4. Системная директория windows_dir\SYSTEM32 ( или windows_dir\SYSTEM для Win98).
5. Директория, в которую установлена операционная система windows_dir.
6. Директории, перечисленные в системной переменной окружения PATH.

Если библиотека DLL использует в своей работе другую DLL, то в случае отсутствия второй DLL первая не сможет загрузиться.

В отличие от системных библиотек пользовательские библиотеки (MQL4) загружаются для каждого вызывающего модуля отдельно, независимо от того, была ли загружена вызываемая библиотека каким-либо другим модулем. Например, модуль caller.ex4 вызывает функции из библиотеки lib1.ex4 и lib2.ex4. В свою очередь, библиотека lib1.ex4 вызывает функции из библиотеки lib2.ex4. В этом случае будет загружена одна копия библиотеки lib1.ex4 и две копии библиотеки lib2.ex4, несмотря на то, что все вызовы исходят из модуля caller.ex4.

Функции, импортируемые из DLL в mql4-программу, должны обеспечивать соглашение о связях, принятое для функций Windows API. Для обеспечения такого соглашения в исходном тексте программ, написанных на языках C или C++ используется ключевое слово __stdcall, которое является специфическим для компиляторов от фирмы Microsoft®. Обсуждаемое соглашение о связях характеризуется следующим:
- вызывающая функция (в нашем случае mql4-программа) должна "видеть" прототип вызываемой (импортируемой из DLL) функции, для того чтобы правильно сложить параметры на стек;
- вызывающая функция (в нашем случае mql4-программа) складывает параметры на стек в обратном порядке, справа налево - именно в таком порядке импортируемая функция считывает переданные ей параметры;
- параметры передаются по значению, за исключением тех, которые явно передаются по ссылке (в нашем случае строк)
- импортируемая функция, считывая переданные ей параметры, сама очищает стек.

При описании прототипа импортируемой функции использовать параметры со значениями по умолчанию бесполезно, т.к. все параметры в импортируемую функцию следует передавать явно.

В случае если вызов импортируемой функции оказался неудачным (в настройках эксперта запрещено использовать импортируемые функции либо соответствующая библиотека не смогла загрузиться), эксперт останавливает свою работу с соответствующим сообщением "expert stopped" в журнале. При этом эксперт не будет запускаться, пока не будет заново проинициализирован. Эксперт может быть переинициализирован в результате перекомпиляции либо после открытия таблицы свойств эксперта и нажатия кнопки OK. 

1 раз длл срабатывают, а потом не хотят обмениваться
PM MAIL   Вверх
kami
Дата 13.7.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(Racer @  13.7.2010,  11:25 Найти цитируемый пост)
2) мне тоже кажеться, что MetaTrader как то сам разрывает соединение.  Как проверить так ли это?

Цитата(kami @  4.7.2010,  19:23 Найти цитируемый пост)
сделай dllMain и снабди код дллок текстовым логом.

Еще одно бредовое предположение - вместо StrToInt использовать TryStrToInt.
PM MAIL WWW   Вверх
MetalFan
Дата 13.7.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



хм. я отстал от жизни)
классовые функции/процедуры можно безболезненно назначать в кач.обработчиков?
Код

 TSockEvents = class
    class procedure SockRead(Sender: TObject; Socket: TCustomWinSocket);
  end;
...
function ClStart: Boolean; stdcall;
begin
...
    Sock.OnRead:= TSockEvents.SockRead;
...




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Racer
Дата 13.7.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



да
PM MAIL   Вверх
Racer
Дата 14.7.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



я сделал dllMain. таким образом:
Код

procedure DLLPro(Reason: Integer);
var
  s: TStringList;
begin
  if Reason = DLL_PROCESS_DETACH then begin
    s:= TStringList.Create;
    s.Add('server exit '+ TimeToStr(Time));
    s.SaveToFile(ExtractFilePath(ParamStr(0))+ 'serlog.txt');
    s.free;
  end;
end;

exports
  Write, ServStart, ServStop, GetConCount;

begin
  DLLProc := @DLLPro;
end.


Когда я закрываю терминал, то файл появляется, а сразу после вызова ф-ции терминалом файла нет. это значит, что библиотека из памяти не выгружается. Что может быть еще?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.