Друзья, помогите с CSocket::OnReceive - страница 2

 
sergeev:
1

В принципе поток как таковой он может юыть привязан к окну. Но к сожалению в dll это надо самому прописывать, и наверно свое созданное окно в систему регистрировать. Затем поток как то к этому окну вязать и оконную процедуру. Вобщем я с этим никогда не сталкивался.

Но блин надо оооччень.

2

то есть вы использовали исходные WSA функциии http://msdn.microsoft.com/en-us/library/ms741394%28v=VS.85%29.aspx ?
и затем бесконечный цикл на для recv() ?

3
CSocket асинхронный.

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

2- да, функции WSA. у меня асинхронное. для асинхронки- либо окошки- либо IOCompletionPort. у меня с портом.
но можно и так- тупо висеть в recv() все равно быстрее не будет. надо просто заполнить несложные структуры- и все.

3- "только асинхронный" ? не верю. есть два режима
http://msdn.microsoft.com/en-us/library/09dd1ycd(v=vs.71).aspx

 

короче я все понял. вчера порылся в недрах CSocket. Выяснил, что он проверяет событие прихода по милисекундному таймеру. Этот таймер цепляется к окну CSocketWnd, которое создается в CSocket.

Получается, что надо полюбасу делать где то бесконечный цикл, по обслуживанию этого окна CSocketWnd.

А значит, что завязываться с MFC сокетами в DLL смысла нет. Прозрачнее будет, если напрямую работать с винсоком, сделать для них бесконечный цикл в отдельном потоке и слушать recv.
По сути это получится то же самое что и с CSocket, только все будет видно что и куда идет.

 
sergeev:

Получается, что надо полюбасу делать где то бесконечный цикл, по обслуживанию этого окна CSocketWnd.

Да. Поэтому и нужен отдельный поток под этот цикл.
sergeev:

А значит, что завязываться с MFC сокетами в DLL смысла нет. Прозрачнее будет, если напрямую работать с винсоком, сделать для них бесконечный цикл в отдельном потоке и слушать recv.

Винсок лучше, да. Мфц приплетать не надо...
Про бесконечный цикл не понял. Можно просто делать blocking call.
 

Все получилось сделать без использования самописной DLL.

Работаю напрямую с Ws2_32.dll из MQL.

Летает :)

 
Кросавец :)
 
sergeev:


Все получилось сделать без использования самописной DLL.

Работаю напрямую с Ws2_32.dll из MQL.

Летает :)


исходник покажете?
 
Graff:

исходник покажете?

конечно, весь код вот отсюда http://msdn.microsoft.com/en-us/library/ms737591%28v=VS.85%29.aspx можно сказать один в один.

все функции сокета просто импортнул

//------------------------------------------------------------------    import Ws2_32.dll
#import "Ws2_32.dll"
        int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData[]);
        int WSACleanup();
        int WSAGetLastError();

        ushort WSAAPI htons(ushort hostshort);
        ulong inet_addr(char &cp[]);
        
        SOCKET WSAAPI socket(int af, int type, int protocol);
        int connect(SOCKET s, LPSOCKADDR name[], int namelen);
        int ioctlsocket(SOCKET s, int cmd, int &argp);
        int send(SOCKET s, char &buf[], int len, int flags);
        int recv(SOCKET s, char &buf[], int len, int flags);
        int shutdown(SOCKET s, int how);
        int closesocket(SOCKET s);
#import


Кстати, Graff, я похоже нашел способ как работать с функциями, которые возвращают указатель. Помните, когда мы с вами с MySQL разбирались была такая проблема?

 
sergeev:

конечно, весь код вот отсюда http://msdn.microsoft.com/en-us/library/ms737591%28v=VS.85%29.aspx можно сказать один в один.

все функции сокета просто импортнул


Кстати, Graff, я похоже нашел способ как работать с функциями, которые возвращают указатель. Помните, когда мы с вами с MySQL разбирались была такая проблема?

помню, в списках изменений про строки и длл часто пишут, может что-то добавилось. Завтра можем попробовать с мускулом поработать.
 
Graff:

помню, в списках изменений про строки и длл часто пишут, может что-то добавилось. Завтра можем попробовать с мускулом поработать.

вобщем идея проста и очевидна - это перегон указателей через memcpy. Если встречаются строки, то их вытягивать через strcpy.

то есть ему даешь указатель, а он тебе возвращает заполненный char массив. Этот массив потом присваиваешь структуре. Вобщем вот такая операция.

сами memcpy и strcpy работают нормально, только что проверил. теперь надо проверить их в боевых условиях.

по текущей теме сокетов есть такие функции - gethostbyname и getaddrinfo. Они как раз возвращают указатели на структуры c разными данными, в том числе и с NULL-terminanted строками.
так что можно поработать с ними.

Причина обращения: