Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Курсовая - mailSlot + winApi (MSVS 2003), не хватает навыков, перечисляю аспекты: 
V
    Опции темы
Мурлыкатам_
Дата 16.5.2007, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Братцы помогите с такой вот штукой:
Задание курсовое: многопользовательский чат для общение в ЛАН в реальном времени, с использованием технологии мэйл слот.
Вопросы по Mail Slot:
1. Как мне положить сообщение в почтовый слот удаленного компьютера?
(CreateFile("\\\\remotePC\\mailslot\\RemoteMyMailSlot", ...)   - это из этой степи? или я просто не знаю функции которая отпровляет сообщение в удаленный почтовый слот?  )
2. Как мне сделать список пользователей, или событие входа / выхода в / из чата, как чат на моем компьютере должен узнать что удаленный ПК запустил чат?
(мне пока кроме следущей схемы ничего не приходит в голову: 
1. чат анализирует сетевый настройки своего компьютера (мот знаете где найти функции взятия ip),
результат анализа - диапазон ip в которых предположительно может быть установлен чат.
2. чат отсылает массовое сообщение (есть ли функция посылки сообщения сразу всем, или надо циклом перебирать ip?) и если сообщение достигает цели, то цель возврощает сообщение, на подобие "у мя тоже чат, вот мои имена, адреса, и т.д.".
3. при получении ответного сообщение добовляем его в базу пользователей и инициируем визуальный эффект входа нового юзера.
4. При выходе отправляется сообщение что юзер вышел.)

Где мне найти информацию про richEdit я пока на нем остановился, или есть лучший компонент для отображение текста пользователей?
по рич едиту:
1. удивила штука SendDlgItemMeassage(); после делфи оч непривычно, мне непонятны следующие штуки начинающиеся с LB_ ... как их осознать? где взять инфу (рус желательно) по работе с рич едитом. 

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

и опять mail slot  (так для общего развития), если кто общался с ними близко, это вообще для чатов перспиктивная вещь? или есть более полезные технологии?
в си шарпе тоже есть мэйл слоты? если да, то в каком они классе находяться?

Надеюсь, что найдуться люди неравнодушные к моим вопросам, с нетерпением жду ответов  smile 

Это сообщение отредактировал(а) Мурлыкатам_ - 16.5.2007, 02:16


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Мурлыкатам_
Дата 17.5.2007, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Или хотя бы подскажите почему программа зависает при выполнение следующего кода: 
Код

char buff[10];
            
            strcpy(buff, "da da!");
            
            hMailSlot = CreateMailslot("\\\\.\\mailslot\\newMessagSlot", 0, MAILSLOT_WAIT_FOREVER, NULL);
            if(hMailSlot == INVALID_HANDLE_VALUE)
            {
                MessageBox(hDlg,"Invalid HANDLE!!!", "Information: ", 0);
            }
            else
            {
                DWORD dwN;
                MessageBox(hDlg, "Succes!", "Information: ", 0);
                WriteFile(hMailSlot, &buff, strlen(buff), &dwN, 0 );
                // ReadFile(hsl, &buffer, 255, &nBytesRead, NULL)!=
            }

эта часть вроде работает номана, но когда мы с тем же хэндлом hMailSlot пытаемся сделать чтение слота, то все виснет (((( :

Код

char buff1[255];
            DWORD dwN;
        

            if(hMailSlot == INVALID_HANDLE_VALUE)
            {
                MessageBox(hDlg,"Invalid HANDLE!!!", "Information: ", 0);
            }
            else
            {
                ReadFile(hMailSlot, &buff1, 255, &dwN,NULL);
            }

пепси тому кто поможет!  smile 


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
jonie
Дата 17.5.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

1. удивила штука SendDlgItemMeassage(); после делфи оч непривычно, мне непонятны следующие штуки начинающиеся с LB_ ... как их осознать? где взять инфу (рус желательно) по работе с рич едитом. 
LB_* это сообщения я так понимаю.. ну так MSDN - так про это написано... про рич эдит почитай там же.
Цитата

2. чат отсылает массовое сообщение (есть ли функция посылки сообщения сразу всем, или надо циклом перебирать ip?) и если сообщение достигает цели, то цель возврощает сообщение, на подобие "у мя тоже чат, вот мои имена, адреса, и т.д.".
в пределах свичей\хабов\прочей тупой фигни и НЕ через маршрутизатор пойдет broadcast - указываешь получателем адресс 255.255.255.255 и шлешь - рассылается всем....
Цитата

1. чат анализирует сетевый настройки своего компьютера (мот знаете где найти функции взятия ip)

хотябы так:
Код

void GetMyIPAsString(OUT char* szIPAddress)
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD (1,1),&wsaData);
    char HostName[1024];
    //DWORD m_HostIP = 0;
    if(!gethostname(HostName, 1024))
    {
        if(LPHOSTENT lphost = gethostbyname(HostName))
        {
            //m_HostIP = ((LPIN_ADDR)lphost->h_addr)->s_addr;
            lstrcpyn(szIPAddress,inet_ntoa(*((in_addr*)lphost->h_addr_list[0])),15);
        }
    }
    
    WSACleanup();
}
но этот код нехорош отсуствием перебора всех доступных ип-ов (чуток поправить и усе будет))
Цитата

Список юзеров лучше заносить в List или в другой компонент?
куда тебе больше нравится.. ябы заносил в вектор структур, а уж отображать-то дело техники... хоть поверх окна рисуй....
Цитата

и опять mail slot  (так для общего развития), если кто общался с ними близко, это вообще для чатов перспиктивная вещь? или есть более полезные технологии?
Есть - jabber ) более устаревшее и менее безопасное - IRC. хотя это уже распределенные сети с выделеными ведущими узлами....
Цитата

2. Как мне сделать список пользователей, или событие входа / выхода в / из чата, как чат на моем компьютере должен узнать что удаленный ПК запустил чат?
запущенный чат должен проиформировать твой чат о событии, также стоит использовать пинг-понг, чтобы вести учет реально существующих а не дохлых клиентов (малоли как он там у себя чат отрубит). В простейшем случае - broadcast для внутреней сети простенькой пойдет)
в более продвинутом случае (наличие маршрутизаторов например) тебе либо надо делать ведущие узлы, либо чистый p2p , что требует уже совсем не детских знаний в распределенной обработке информации....
Цитата

но когда мы с тем же хэндлом hMailSlot пытаемся сделать чтение слота, то все виснет (((( :
ReadFile работает в блокирующем режиме, видимо.... и ждет пока информация не поступит. Используй либо потоки (читай в отдельном потоке и уведомляй главный поток о информации посредством объектов синхронизации), либо используй ReadFileEx() обратив внимание на поле LPOVERLAPPED (читай MSDN)
---
все.. пора завязывать с БД, а то уже вместо QUOTE пишу query.....

Это сообщение отредактировал(а) jonie - 17.5.2007, 23:59


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Мурлыкатам_
Дата 18.5.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Следующий вопрос:
  После того как я записал сообщение в мэйл слот консольной прогой, и считал ее виндовсовской прогой в рич едит, хэндл становиться 0xfffffffff и второе сообщение уже передать нельзя... есть у кого нить мысли по этому поводу, как передать n-ое сообщение?
  Можно ли как нить обработать считываемое сообщение или передоваемое таким образом, чтобы было только само сообщение, без "МММММ" и "гц" на хвосте?

Это сообщение отредактировал(а) Мурлыкатам_ - 18.5.2007, 14:01


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
jonie
Дата 19.5.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

  Можно ли как нить обработать считываемое сообщение или передоваемое таким образом, чтобы было только само сообщение, без "МММММ" и "гц" на хвосте?
пиши сообщения в формате скажем "количество символов сообщения - далее само сообщения", а при приеме отрезай по количеству сколько послал клиент....
----------
поправка по поводу ReadFile и асинхронного ВВ.
почитай еще раз документацию к CreateMailslot(), там есть параметр сколько ждать при чтении.... (сам с этим "чудом" (видимо очень кросплатформенным))) не работал ).
--------------
да и вообще имхо не очень удобно....
Код

the application cannot write more than 424 bytes at a time to the mailslot

Цитата

 После того как я записал сообщение в мэйл слот консольной прогой, и считал ее виндовсовской прогой в рич едит, хэндл становиться 0xfffffffff и второе сообщение уже передать нельзя... есть у кого нить мысли по этому поводу, как передать n-ое сообщение?
а ты часом майлслот нигде не закрываешь ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Мурлыкатам_
Дата 19.5.2007, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



О начало положено  smile 
jonie, - ты был прав насчет ReadFile - он просто зависает в ожидании сообщения,
MailSlot создаваемый с MAILSLOT_WAIT_FOREVER - вешает прогу до получения сообщения... что не есть гуд.

Код

hf=CreateFile("\\\\*\\mailslot\\newMessageSlot",GENERIC_WRITE,
        FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);


Забавная штука на пределе магии  smile  )))))"\\\\*\\mailslot\\newMessageSlot"
 - в этом случае (я уже проверил) сообщение передается, не известно пока мне каким образом, всем компьютерам сети, имеющим такой мэйл слот... что для меня похоже решает практически проблему с событием - входа выхода из в чат )))))) просто надо проверять слот и все ))))))

Цитата

пиши сообщения в формате скажем "количество символов сообщения - далее само сообщения", а при приеме отрезай по количеству сколько послал клиент....


jonie, - спасибо за идею, просто кул! Я как-то даже об этом не думал ...
С хэндлом вопрос решился, баг до боли смешной ))) хэндл объявлялся равным НУЛЛ и инициализировался по нажатию кнопки, и получается я каждый раз пытался создать заново слот, проблема решилась следующим образом:
- глобальный хэндл hMailSlot (нормально что он глобальный, или можно найти более изящное решение?)
- проверка хэндла 

Код

if(hMailSlot == NULL)
{
            hMailSlot = CreateMailslot("\\\\.\\mailslot\\newMessageSlot", 0, MAILSLOT_WAIT_FOREVER, NULL);
}


Я вот думаю, проверку на присутствие сообщения наверное лучше вообще по таймеру делать?
Хм.. не получается у мя цифры в строку скопировать ...
Код

char buffer[255];
        strcpy(buffer,"ne dai bog budut галимые мки, хотя они вроде и классные");
        n = strlen(buffer);
        strcpy(buffer, (LPCSTR)n);

дает Unhalted Exception .. и че делать?! Что то я совсем в строках слаб ...

Это сообщение отредактировал(а) Мурлыкатам_ - 19.5.2007, 08:35


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
jonie
Дата 19.5.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Забавная штука на пределе магии    )))))"\\\\*\\mailslot\\newMessageSlot"
 - в этом случае (я уже проверил) сообщение передается, не известно пока мне каким образом, всем компьютерам сети
в документации это указано, передается всем в пределах домена вроде (чет я такое там видел))
Цитата

Хм.. не получается у мя цифры в строку скопировать ...
числа надо преобразовывать в строки, и только после этго уже копировать. ибо "строкой"  у тябя является любые байты до NULL-а. см. itoa() - и подобные функции (sprintf например)
Цитата

- глобальный хэндл hMailSlot (нормально что он глобальный, или можно найти более изящное решение?)
я бы сделала вообще не так... я бы сделал класс-обертку над этим хендлом и работал с ним. т.е. этот класс имел бы функции типа 
CheckMessageQueue(.....) - проверка в неблокируещем режиме  на присуствие сообщений
ReadMessage(.......)  - читаем
WriteMessage(.....) - пишем
IsClientAlive (.....) - проверка что клиен онлайн (вызов по таймеру или еще как)
Конструктор - создание слота
Деструктор - его особождение.
ну и иные функции нужные...
(в более развернутой реализации сделал бы абстрактный класс, описывающий собственно функциональность месседжера, и от него отнаследовал бы для майлслота...)
----
ну и далее работал бы с экземпляром такого класса....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Мурлыкатам_
Дата 21.5.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Цитата

ну и далее работал бы с экземпляром такого класса....

Кул!!!  smile уважение!
Вот это идея!

Жалко что я не умею классы делать по человечески  smile 

Цитата

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



Эт я уже додумался! smile))) 
Не могу сделать изящную проверку на присутствие сообщения :(((((((
Цитата

я бы сделала вообще не так... я бы сделал класс-обертку над этим хендлом и работал с ним. т.е. этот класс имел бы функции типа 

И принимал бы как параметр хэндл слота ... ?!
Что значит обертка? С этого места плз помедленней  smile 

Это сообщение отредактировал(а) Мурлыкатам_ - 21.5.2007, 19:33


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
jonie
Дата 22.5.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

class MailSlot{
 private:
    HANDLE _hMailSlot;
   /*иные нужные данные*/
 public:
  /* методы */
};

Цитата

Не могу сделать изящную проверку на присутствие сообщения :(((((((

MSDN : GetMailslotInfo() ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Мурлыкатам_
Дата 22.5.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Класс я прибожил вроде ))
сразу возникла такая проблема: 

Код

if(flag == true)
            {
            hMailSlot = CreateMailslot("\\\\.\\mailslot\\newMessageSlot", 0, 5, NULL);
            ChatThroughMailSlot CTMS(hDlg,hMailSlot);
            CTMS.ReadMessageFromSlot();
            }
            за этой скобкой вся проблема!!!! 

почему за скобкой закрывающей мой объект класса CTMS уже не существуюет???  smile 
это так не удобно и обидно ((((
Где надо граммотно проинициализировать класс?
Не работать же с объектом класса в WM_TIMER ?! smile 
Или как по-другому сделать красиво циклическую проверку на присутствие мессаги?

Цитата

MSDN : GetMailslotInfo() ?


Че-то у мя с этой штукой пока ниче не получается (((((( 


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
jonie
Дата 22.5.2007, 22:55 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

почему за скобкой закрывающей мой объект класса CTMS уже не существуюет???   
это так не удобно и обидно ((((
потому что это язык С\С++, перед выходом за область видимости объект будет разрушен.
Цитата

Где надо граммотно проинициализировать класс?
ну ежели у тебя диалог, то наверно в обработчике WM_INITDIALOG... или по событию от пользователя... да вообще малоли где...
Код

Не работать же с объектом класса в WM_TIMER ?!  
Или как по-другому сделать красиво циклическую проверку на присутствие мессаги?
есть несколько способов... как минимум отдельный Thread для обслуживания объекта, он там себе пусть проверяет когда хочет и чего хочет, и, скажем передавал бы инофрмацию в главное окно через сообщения теже (можно даже свои сообщения зарегить...)....ну и само-собой, необходимо взаимосвязывание потоковое (типа выхода из проги..) .. это, наверно, самое простое из красивости.... можно использовать механихм CALLBACK тоже вкупе...
Цитата

            hMailSlot = CreateMailslot("\\\\.\\mailslot\\newMessageSlot", 0, 5, NULL);
            ChatThroughMailSlot CTMS(hDlg,hMailSlot);
создание слота (равно как и его закрытие) внес бы в класс чтоли... нафиг он тебе "вне" ?

Это сообщение отредактировал(а) jonie - 22.5.2007, 22:57


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Мурлыкатам_
Дата 23.5.2007, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Я не знаю наверное у меня очень кривые руки  smile  (((((((((((

Код

class ChatThroughMailSlot
 {
 public:
     HWND _hwnd;
     HANDLE _hMSlot;
     char strBuffer[255];
     DWORD NumberOfBytesToRead;
     DWORD NumberOfBytesRead;
     LPOVERLAPPED Overlapped;
     bool AlreadyCreated;
     ChatThroughMailSlot(HWND hwnd, HANDLE hSlot)
     {
         
         _hwnd = hwnd;
         _hMSlot = hSlot;
         if(_hMSlot != INVALID_HANDLE_VALUE && _hwnd != INVALID_HANDLE_VALUE)
         {
             NumberOfBytesToRead = 255;
             NumberOfBytesRead;
             Overlapped = NULL;
             flag = false;
             MessageBox(_hwnd, "пока все нормально", "информация:",0);
         }
     }

     ~ChatThroughMailSlot()
     {
         CloseHandle(_hMSlot);
//         CloseHandle(_hwnd); - тут почему то ошибка (((((((((((
     }
     void ReadMessageFromSlot()
     {
         //ReadFile(hMailSlot, &buff1, 255, &dwN,NULL);
         if(_hMSlot != INVALID_HANDLE_VALUE)
         {

         ReadFile(_hMSlot, &strBuffer, NumberOfBytesToRead, &NumberOfBytesRead, Overlapped);
         MessageBox(_hwnd, (LPCSTR) strBuffer, "",0);
         }
     }

 };

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

LRESULT CALLBACK TDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{           
    
    switch (message)
    {
    case WM_INITDIALOG:
        {   
    //                Если инициализировать класс тут, то в WM_TIMER он уже не будет 
            //работать                     (((((((     
            return TRUE;
        }
    case WM_TIMER:
        {
// попытка однократного создания экземпляра класса
            
            if(flag == true)
            {
            hMailSlot = CreateMailslot("\\\\.\\mailslot\\newMessageSlot", 0, 5, NULL);
            ChatThroughMailSlot CTMS(hDlg,hMailSlot);
            CTMS.ReadMessageFromSlot();
            }
            //GetMailslotInfo - чисто ради МСДН )))))
// тут 100 % рабочий код, который уже получает мессаги от удаленных компов!
            /*   long i;
            char buff1[255];
            DWORD dwN;
            char buff[10];
              if(hMailSlot == NULL)
                {
    hMailSlot = CreateMailslot("\\\\.\\mailslot\\newMessageSlot", 0, 5, NULL);
    hMailSlot2 = CreateMailslot("\\\\.\\mailslot\\MessageLength", 0, 5, NULL);
                }
              if(hMailSlot != INVALID_HANDLE_VALUE)
                {
                    ReadFile(hMailSlot, &buff1, 255, &dwN,NULL);
    SendDlgItemMessage(hDlg, IDC_RICHEDIT23, LB_ADDSTRING, 0, (LPARAM) buff1);
    SetDlgItemText(hDlg, IDC_RICHEDIT23, (LPCSTR) &buff1);
                }*/
        }
    case WM_COMMAND:
        // запуск таймера! 
        if (LOWORD(wParam) == IDC_BUTTON1)
        {
            SetUserTimer(hDlg, 100);
        }
        if (LOWORD(wParam) == IDOK)
        {
            KillTimer(hDlg,1);
                        
        }
        if (LOWORD(wParam) == IDCANCEL) 
        {
    //        MessageBox(hDlg, (LPCSTR)buff1, "Information: ", 0);
            //char str[80];
        //    FreeLibrary(hLib);
    
        //    SendDlgItemMessage(hDlg,IDC_LIST1, LB_ADDSTRING,0,(LPARAM)str); 
            EndDialog(hDlg, LOWORD(wParam));
            
            return TRUE;
        }
        break;
    }
    return FALSE;
}
 

1. короче больше всего пугает оч маленькая область видимости, у мя получается где не сделай инициализацию класса, то за ближайшей фигруной скобной, класс уже не видно ((((((((
2. надо наверное какую-то все таки структуру передовать вместо простого текстового сообщения ...
3. не могу строки поразрезать шикарно (((
4. в принципе с созданием слота, действиетльно мона внести в класс ...
5. с потоками я вообще не дружу (((((((((, возможно сделать красивую проверку с потоком? 


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
jonie
Дата 23.5.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

1. короче больше всего пугает оч маленькая область видимости, у мя получается где не сделай инициализацию класса, то за ближайшей фигруной скобной, класс уже не видно ((((((((
ну а в чем проблема поднятия его (или указателя на него) на глобальную область видимости?!


Это сообщение отредактировал(а) jonie - 23.5.2007, 10:29


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Мурлыкатам_
Дата 25.5.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Цитата

ну а в чем проблема поднятия его (или указателя на него) на глобальную область видимости?!


все проблемы нет  smile 

 smile 
хм.. я пока додумался тока пере вин мэйном его объявить глобально:

Код

ChatTroughMailSlot CTMS;


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

А куда лучше выводить текст? Что-то я смотрю у мя с рич эдитом ниче не получается (((
Мне нужно добовлять строкик как было в делфи "memo1.lines.add('aaaa');" а тут я пишу ему:
Код


SendDlgItemMessage(hDlg, IDC_RICHEDIT23, LB_ADDSTRING, 0, (LPARAM) "123");

короче я решил все в листбоксы писать... или куда лучше?


Это сообщение отредактировал(а) Мурлыкатам_ - 1.6.2007, 00:26


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Мурлыкатам_
Дата 2.6.2007, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



Короче я не подеццки поднапрягся и у мя уже есть многопользовательский чат )))))))
Потоки окозались не такими зубастыми как я ))))))  smile 
Правда возникла, как всегда у меня почему-то, текстовая проблема.
Сообщение отсылаемое моим чатом, в моем чате дублируется 4 раза:
Привет
Привет
Привет
Привет
На принимающем компе все кул, приходит тока 1 привет  smile 
У меня поток, который отвечает за считывание входящих сообщений срабатывает 3 раза, и 1 раз по кнопке у мя вставляется текст. 
Мне надо сделать так: поток читает тока "входящие сообщения" а на "исходящие не реагирует", как так сделать?

вот код моего мега чата!!! (90% рабочий чат!!!!)  smile  мот кто нить заметит ошибку. а то я совсем сон потерял....
Код

LRESULT CALLBACK C(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    hTemp = hDlg;
    switch (message)
    {
    case WM_INITDIALOG:
        {
        
            hs = CreateMailslot("\\\\.\\mailslot\\messaga", 0 , MAILSLOT_WAIT_FOREVER , NULL);
        if (hs != INVALID_HANDLE_VALUE)
        {
            char str[30] = "Почтовый слот успешно создан!";
            SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, NULL, (LPARAM) str);
            DWORD idServerThread;
                                
                                // создание потока для выполнения серверной части приложения
                                hServerThread = CreateThread(NULL,                    // указатель на структуру SECURITY_ATTRIBUTES (атрибуты защиты по умолчанию)
                                                             0,                    // определяет часть адресного пространства под стек потока (задаёт системой 1Мб)
                                                             ServerThreadFunc,    // адрес функции потока
                                                             NULL,                // любое необходимое для инициализации значение
                                                             CREATE_SUSPENDED,    // дополнительные флаги, управляющие созданием потока:
                                                                                // 0 - немедленно начать выполнение потока
                                                                                // CREATE_SUSPENDED - придержание выполнения потока
                                                                            
                                                             &idServerThread);    // адрес переменной типа DWORD - идентификатор, приписанный системой новому потоку
                        
                                // задание относительного приоритета выполнения созданного потока
                                SetThreadPriority(hServerThread,THREAD_PRIORITY_NORMAL);
        
                                // разрешение на запуск серверного потока
                                repeat = TRUE;

                                // запуск серверного потока
                                ResumeThread(hServerThread);        

        }
        return TRUE;
        }
    case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                case IDC_BUTTON1:
                {  
                    HANDLE hs2 = NULL;
                    char str[370];
                     GetDlgItemText(hDlg, IDC_EDIT1, (LPSTR)str, 370);
                     hs2=CreateFile("\\\\*\\mailslot\\messaga",GENERIC_WRITE,
                                    FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
                     if (hs2!=INVALID_HANDLE_VALUE)
                        {
                        DWORD dwwr;
                        WriteFile(hs2,&str,strlen(str),&dwwr,NULL);
                        SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, NULL, (LPARAM) str);
                        CloseHandle(hs2);
                        }
                }
                    break;
                case IDOK:
                {
                    EndDialog(hDlg, LOWORD(wParam));
                    
                    return TRUE;
                }
                    break;

            }
        }
        
    }
    return FALSE;
}
DWORD WINAPI ServerThreadFunc(LPVOID lpvThreadParm)
{
    HWND hTemp1 = hTemp;
    // счётчик элементов массива пользователей и количества совпадений
    short c;

    // Код возврата из функций
    BOOL   fReturnCode; 

    // Размер сообщения в байтах
    DWORD  cbMessages;
    
    // Количество сообщений в канале Mailslot
    DWORD  cbMsgNumber;
    bool f = FALSE;
    DWORD dwResult = 0;
    char msg[370];
    DWORD dwRead;
    char str2[370] = "";
    char str3[50] = "Сообщений нету ((";
    while (repeat)
    {
        f = GetMailslotInfo(hs, NULL, &cbMessages, &cbMsgNumber, NULL);
        if(!f)
        {
            MessageBox(hTemp1, "Че-то нечисто ...", "Вопросы чистоты", 1);
        }
        else
        {
            if (cbMessages != 0)
            {
             if (ReadFile(hs, &str2, 424,  &dwRead, NULL) != 0)
                    {
                    SendDlgItemMessage(hTemp1, IDC_LIST1, LB_ADDSTRING, NULL, (LPARAM) str2);
                    //MessageBox(hDlg, str2,"", 1);
                    
                    }
                  
                }
        }
        Sleep(100);
    }
    return (dwResult);
}



Это сообщение отредактировал(а) Мурлыкатам_ - 2.6.2007, 03:15


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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