Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Отследить нужную сессию.


Автор: DFA 10.12.2013, 21:45
Извиняюсь, если не в нужный раздел фрума. Пишу на VC6 MFC.
Написана программа обмена небольими текстовыми сообщениями.
Структура такая: есть сервер, который разруливает потоки сообщений от клиентов, установленных на компы сотрудников офиса, работающих на XP. Построено на сокетах.
Я удаленно подключаюсь к другому серверу в офисе, где крутится 1С, по VPN.
На нем Win2003 SP2 и клиент для связи по офису. И тут возникает проблема - получаемые мной сюда сообщения приходят, как я понимаю, не в мою сессию и я, естесственно, их не вижу. Как мне направить входящие к себе?

Автор: feodorv 12.12.2013, 10:56
Честно говоря, не понятно. О каких сессиях идёт речь? 
Сервер Вами написан? А клиент? 
Правильно ли я понял, что Вы удалённо подключаетесь к компу, на котором установлен клиент для связи по офису, работающий на сокетах; и получаемые сообщения от сервера, который разруливает потоки сообщений от клиентов, Вам не передаются, потому что Вы удалённо подсоединены?

Автор: DFA 14.12.2013, 21:38
Поясню на примере :
У сервера сообщений таблица соответствия:
Вася ...0.1
Петя ...0.2

Вася подключился удаленно к серверу, который ...0.1, залогинился там, стал ID1, потому что ID0 это основной сеанс.
Петя работает за своим компом (...0.2) и видит, что Вася в системе (у него есть список пользователей кому он может отправить сообщение и у имени Вася теперь стоит '+'). Петя отправляет сообщение Васе, сервер пересылает его на ...0.1, но Вася его не получает, хотя сообщение приходит на адрес ...0.1, НО к iD0.
Вопрос: есть ли возможность переслать полученное клиентом в ID0 сообщение к ID1?

Сервер и клиент написаны мной, возникла одна мысль – поиграть с портами для разных ID, в связи м этим еще один вопрос: Использую. VC6. пытаюсь воспользоваться функцией ProcessIdToSessionId

#pragma comment(lib, "kernel32.lib")
    
    DWORD pSessionId;
    DWORD curPID;
    curPID=GetCurrentProcessId();

    BOOL ret=ProcessIdToSessionId(curPID,pSessionId);
    
Не получается. Что не так?

Автор: Dem_max 15.12.2013, 08:55
Цитата

Петя отправляет сообщение Васе, сервер пересылает его на ...0.1, но Вася его не получает, хотя сообщение приходит на адрес ...0.1, НО к iD0.


так исправь свой код и посылай на правильный ID

Автор: DFA 15.12.2013, 12:01
Используя сокеты, я задаю адрес, но не ID. Адрес-то правильный, ID другой! 
У меня функцию ProcessIdToSessionId не находит, говорит нет такой, хотя в stdafx.h добавил #define _WIN32_WINNT 0x0500

    
Код

               #include "WinBase.h"
    #pragma comment(lib, "kernel32.lib")

    DWORD pSessionId;
    DWORD curPID;
    curPID=GetCurrentProcessId();

    BOOL ret=ProcessIdToSessionId(curPID,pSessionId);
    
Что я не так делаю?

Автор: Dem_max 15.12.2013, 17:21
Цитата

Что я не так делаю?


Уже избавься от VS6 которая была разработана 20 лет назад.

Автор: GremlinProg 16.12.2013, 06:40
Цитата(DFA @  15.12.2013,  14:01 Найти цитируемый пост)
У меня функцию ProcessIdToSessionId не находит, говорит нет такой

Код

WINBASEAPI
BOOL
WINAPI
ProcessIdToSessionId(
    __in  DWORD dwProcessId,
    __out DWORD *pSessionId
    );


Автор: xvr 16.12.2013, 14:37
Цитата(DFA @  10.12.2013,  21:45 Найти цитируемый пост)
есть сервер, который разруливает потоки сообщений от клиентов, 


Цитата(DFA @  10.12.2013,  21:45 Найти цитируемый пост)
Построено на сокетах.


Цитата(DFA @  10.12.2013,  21:45 Найти цитируемый пост)
И тут возникает проблема - получаемые мной сюда сообщения приходят, как я понимаю, не в мою сессию


Цитата(DFA @  14.12.2013,  21:38 Найти цитируемый пост)
пытаюсь воспользоваться функцией ProcessIdToSessionId


Лично у меня возник пока только один вопрос - как это все друг с другом связанно? Какое отношение имеют сетевые сокеты к Терминальным Сессиям и кто с кем (или что с чем) должно связываться?

Автор: GremlinProg 16.12.2013, 15:08
Цитата(xvr @  16.12.2013,  16:37 Найти цитируемый пост)
Лично у меня возник пока только один вопрос - как это все друг с другом связанно? Какое отношение имеют сетевые сокеты к Терминальным Сессиям и кто с кем (или что с чем) должно связываться?

Если только все сотрудники офиса не сидят удаленно на одной физической машине, связываясь по loopback с сервером и обмениваются между собой сообщениями через что-то вроде WTSSendMessage

только для таких целей здесь есть одно лишнее звено: 
Цитата(DFA @  10.12.2013,  23:45 Найти цитируемый пост)
Построено на сокетах


 smile

Добавлено через 2 минуты и 19 секунд
хотя, это звено и не мешает работе основной цепочке ))

Автор: DFA 17.12.2013, 09:58
Заработало!
Чтобы как-то разделить клиентов на сервере, использую разные порты - клиент загружается, определяет ID (ProcessIdToSessionId) и подключается к своему порту.

Всем спасибо за участие!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)