Проблема с TCP

 

Здравствуйте уважаемые!

Суть моей задачи:

Пишу на борланде билдере 6, С++. Такой вот динозавр:) 

Хочу по TCP протоколу отправлять на другой комп некие данные из терминала на mql4. Для этого написал dll. Пока простейшую - ибо сразу же произошел затык.

В  dll используется компонент TClientSocket. Соответственно на принимающем компе есть приложение с компонентом TServerSocket.

Так вот, затык при попытке открытия сокета. Сама dll из терминала открывается, функция из терминала запускается (проверял меседжбоксами - все нужные точки проходятся).

А соединение не устанавливается.:(

Самое интересное, написал простое приложение, где по кнопочке вызывается эта же функция из этой же dll - запустил на компе, где стоит терминал - все проходит на ура, соединение устанавливается, серверная часть на другом компе видит присоединенного клиента.

 

Что может быть? Приветствуется любая помощь-совет, ибо пока в тупике:(

 

Никто не ответил.:(

Попытка два. Вот код dll. 

 

#include <windows.h>

#include <ScktComp.hpp>

 

#pragma hdrstop

#pragma argsused


TClientSocket* pCS = NULL;


int WINAPI DllEntryPoint (HINSTANCE hinst, unsigned long reason, void* lpReserved)

{

 return 1;

}


//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) int __stdcall Create_TCP_Terminal () 

{

 pCS = new TClientSocket (NULL);

 pCS->Host = "192.168.0.2";

 pCS->Port = 51000;

 pCS->ClientType = ctNonBlocking;

 pCS->Open ();

 return 111;

}

//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) void __stdcall Konec_TCP_Terminal () 

{

 pCS->Close();

 delete pCS;

 pCS = NULL;

}

//--------------------------------------------------------------------------- 

 

Все простенько. Но функция из dll, вызванная из терминала, не открывает сокет  с TCP-сервером на машине  "192.168.0.2". Хотя эта же функция, вызванная из другого приложения все отлично открывает!

Может у кого есть время и желание помочь и воспроизвести у себя эту ситуацию (пусть в другой среде разработки и с другими компонентами, не важно) - буду благодарен. Особо надеюсь на разработчиков - вам же интересно выявить баги (мнимые или реальные) связанные с вашим продуктом?

Я реально уперся и не понимаю, почему так происходит...

 
Может проблема в вызове библиотеки из MQL, раз сама длл выполняется как задумано?
 
evillive:
Может проблема в вызове библиотеки из MQL, раз сама длл выполняется как задумано?

Да нет. Длл нормально присоединяется в MQL. Функция из длл нормально выполняется. Расставил пару MessageBox (NULL, "1", "1", MB_OK) по телу функции - все они появляются. Ерундель какая то....
 
Izya_Katsman:

Никто не ответил.:(

Попытка два. Вот код dll. 

 


 

Все простенько. Но функция из dll, вызванная из терминала, не открывает сокет  с TCP-сервером на машине  "192.168.0.2". Хотя эта же функция, вызванная из другого приложения все отлично открывает!

Может у кого есть время и желание помочь и воспроизвести у себя эту ситуацию (пусть в другой среде разработки и с другими компонентами, не важно) - буду благодарен. Особо надеюсь на разработчиков - вам же интересно выявить баги (мнимые или реальные) связанные с вашим продуктом?

Я реально уперся и не понимаю, почему так происходит...


Может, для терминала адрес  сервера будет отличаться от 192.168.0.2 ? 
 
Izya_Katsman:

Да нет. Длл нормально присоединяется в MQL. Функция из длл нормально выполняется. Расставил пару MessageBox (NULL, "1", "1", MB_OK) по телу функции - все они появляются. Ерундель какая то....

А не в этом ли причина?

WSAStartup function

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

О! Это действительно похоже на правду. Благодарю! Премного! 
 
Izya_Katsman:

О! Это действительно похоже на правду. Благодарю! Премного! 

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

 
Kalkin:

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


Преогромное спасибо за наводку! Все так и оказалось - действительно, для отлавливания эвентов необходимы либо что-то типа окошек либо пляски с бубном. Как-то сам не догадался про эвенты...

Тем не менее - 50 грамм поднесенные вовремя - дороже бутылки просто так (это я про вовремя поданный дельный совет:))

Ну и скорее всего буду копать по этому же компоненту - там есть блокируемый режим при котором эвенты не нужны - там свои заморочки, но это ближе мне, чем изучать винапи.

Главное - проблема локализована и есть варианты!

Удачи!