Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Сети > Курсовая - mailSlot + winApi (MSVS 2003) |
Автор: Мурлыкатам_ 16.5.2007, 02:15 |
Братцы помогите с такой вот штукой: Задание курсовое: многопользовательский чат для общение в ЛАН в реальном времени, с использованием технологии мэйл слот. Вопросы по Mail Slot: 1. Как мне положить сообщение в почтовый слот удаленного компьютера? (CreateFile("\\\\remotePC\\mailslot\\RemoteMyMailSlot", ...) - это из этой степи? или я просто не знаю функции которая отпровляет сообщение в удаленный почтовый слот? ) 2. Как мне сделать список пользователей, или событие входа / выхода в / из чата, как чат на моем компьютере должен узнать что удаленный ПК запустил чат? (мне пока кроме следущей схемы ничего не приходит в голову: 1. чат анализирует сетевый настройки своего компьютера (мот знаете где найти функции взятия ip), результат анализа - диапазон ip в которых предположительно может быть установлен чат. 2. чат отсылает массовое сообщение (есть ли функция посылки сообщения сразу всем, или надо циклом перебирать ip?) и если сообщение достигает цели, то цель возврощает сообщение, на подобие "у мя тоже чат, вот мои имена, адреса, и т.д.". 3. при получении ответного сообщение добовляем его в базу пользователей и инициируем визуальный эффект входа нового юзера. 4. При выходе отправляется сообщение что юзер вышел.) Где мне найти информацию про richEdit я пока на нем остановился, или есть лучший компонент для отображение текста пользователей? по рич едиту: 1. удивила штука SendDlgItemMeassage(); после делфи оч непривычно, мне непонятны следующие штуки начинающиеся с LB_ ... как их осознать? где взять инфу (рус желательно) по работе с рич едитом. Список юзеров лучше заносить в List или в другой компонент? 1. List: как по строке правой кнопкой мыши нажать, чтобы выпало простенько меню? и опять mail slot (так для общего развития), если кто общался с ними близко, это вообще для чатов перспиктивная вещь? или есть более полезные технологии? в си шарпе тоже есть мэйл слоты? если да, то в каком они классе находяться? Надеюсь, что найдуться люди неравнодушные к моим вопросам, с нетерпением жду ответов ![]() |
Автор: Мурлыкатам_ 17.5.2007, 00:01 | ||||
Или хотя бы подскажите почему программа зависает при выполнение следующего кода:
эта часть вроде работает номана, но когда мы с тем же хэндлом hMailSlot пытаемся сделать чтение слота, то все виснет (((( :
пепси тому кто поможет! ![]() |
Автор: jonie 17.5.2007, 23:58 | ||||||||||||||||
хотябы так:
в более продвинутом случае (наличие маршрутизаторов например) тебе либо надо делать ведущие узлы, либо чистый p2p , что требует уже совсем не детских знаний в распределенной обработке информации....
--- все.. пора завязывать с БД, а то уже вместо QUOTE пишу query..... |
Автор: Мурлыкатам_ 18.5.2007, 13:40 |
Следующий вопрос: После того как я записал сообщение в мэйл слот консольной прогой, и считал ее виндовсовской прогой в рич едит, хэндл становиться 0xfffffffff и второе сообщение уже передать нельзя... есть у кого нить мысли по этому поводу, как передать n-ое сообщение? Можно ли как нить обработать считываемое сообщение или передоваемое таким образом, чтобы было только само сообщение, без "МММММ" и "гц" на хвосте? |
Автор: jonie 19.5.2007, 00:59 | ||||||
---------- поправка по поводу ReadFile и асинхронного ВВ. почитай еще раз документацию к CreateMailslot(), там есть параметр сколько ждать при чтении.... (сам с этим "чудом" (видимо очень кросплатформенным))) не работал ). -------------- да и вообще имхо не очень удобно....
|
Автор: Мурлыкатам_ 19.5.2007, 07:24 | ||||||||
О начало положено ![]() jonie, - ты был прав насчет ReadFile - он просто зависает в ожидании сообщения, MailSlot создаваемый с MAILSLOT_WAIT_FOREVER - вешает прогу до получения сообщения... что не есть гуд.
Забавная штука на пределе магии ![]() - в этом случае (я уже проверил) сообщение передается, не известно пока мне каким образом, всем компьютерам сети, имеющим такой мэйл слот... что для меня похоже решает практически проблему с событием - входа выхода из в чат )))))) просто надо проверять слот и все ))))))
jonie, - спасибо за идею, просто кул! Я как-то даже об этом не думал ... С хэндлом вопрос решился, баг до боли смешной ))) хэндл объявлялся равным НУЛЛ и инициализировался по нажатию кнопки, и получается я каждый раз пытался создать заново слот, проблема решилась следующим образом: - глобальный хэндл hMailSlot (нормально что он глобальный, или можно найти более изящное решение?) - проверка хэндла
Я вот думаю, проверку на присутствие сообщения наверное лучше вообще по таймеру делать? Хм.. не получается у мя цифры в строку скопировать ...
дает Unhalted Exception .. и че делать?! Что то я совсем в строках слаб ... |
Автор: jonie 19.5.2007, 11:19 | ||||||
CheckMessageQueue(.....) - проверка в неблокируещем режиме на присуствие сообщений ReadMessage(.......) - читаем WriteMessage(.....) - пишем IsClientAlive (.....) - проверка что клиен онлайн (вызов по таймеру или еще как) Конструктор - создание слота Деструктор - его особождение. ну и иные функции нужные... (в более развернутой реализации сделал бы абстрактный класс, описывающий собственно функциональность месседжера, и от него отнаследовал бы для майлслота...) ---- ну и далее работал бы с экземпляром такого класса.... |
Автор: Мурлыкатам_ 21.5.2007, 19:30 | ||||||
Кул!!! ![]() Вот это идея! Жалко что я не умею классы делать по человечески ![]()
Эт я уже додумался! ![]() Не могу сделать изящную проверку на присутствие сообщения :(((((((
И принимал бы как параметр хэндл слота ... ?! Что значит обертка? С этого места плз помедленней ![]() |
Автор: jonie 22.5.2007, 00:17 | ||||
под оберткой я понимаю, что класс содержит в себе собстевенно как данные HANDLE куда и откуда читается, так что в методы ничего передавать уже не надо - все и так будет в экземпляре такого класса. Т.е. как-то так
MSDN : GetMailslotInfo() ? |
Автор: Мурлыкатам_ 22.5.2007, 17:32 | ||||
Класс я прибожил вроде )) сразу возникла такая проблема:
почему за скобкой закрывающей мой объект класса CTMS уже не существуюет??? ![]() это так не удобно и обидно (((( Где надо граммотно проинициализировать класс? Не работать же с объектом класса в WM_TIMER ?! ![]() Или как по-другому сделать красиво циклическую проверку на присутствие мессаги?
Че-то у мя с этой штукой пока ниче не получается (((((( |
Автор: jonie 22.5.2007, 22:55 | ||||||||
|
Автор: Мурлыкатам_ 23.5.2007, 02:36 | ||||
Я не знаю наверное у меня очень кривые руки ![]()
Это мой класс, максимально примитивный, учебный, пока что... Ниже, показано место, где класс используется ...
1. короче больше всего пугает оч маленькая область видимости, у мя получается где не сделай инициализацию класса, то за ближайшей фигруной скобной, класс уже не видно (((((((( 2. надо наверное какую-то все таки структуру передовать вместо простого текстового сообщения ... 3. не могу строки поразрезать шикарно ((( 4. в принципе с созданием слота, действиетльно мона внести в класс ... 5. с потоками я вообще не дружу (((((((((, возможно сделать красивую проверку с потоком? |
Автор: jonie 23.5.2007, 10:29 | ||
|
Автор: Мурлыкатам_ 25.5.2007, 18:19 | ||||||
все проблемы нет ![]() ![]() хм.. я пока додумался тока пере вин мэйном его объявить глобально:
Может надо сделать это более изящно? (Сейчас у мя класс в одтельном хэдере, и инициализируется глобально в теле программы до вин майна). А куда лучше выводить текст? Что-то я смотрю у мя с рич эдитом ниче не получается ((( Мне нужно добовлять строкик как было в делфи "memo1.lines.add('aaaa');" а тут я пишу ему:
короче я решил все в листбоксы писать... или куда лучше? |
Автор: Мурлыкатам_ 2.6.2007, 03:12 | ||
Короче я не подеццки поднапрягся и у мя уже есть многопользовательский чат ))))))) Потоки окозались не такими зубастыми как я )))))) ![]() Правда возникла, как всегда у меня почему-то, текстовая проблема. Сообщение отсылаемое моим чатом, в моем чате дублируется 4 раза: Привет Привет Привет Привет На принимающем компе все кул, приходит тока 1 привет ![]() У меня поток, который отвечает за считывание входящих сообщений срабатывает 3 раза, и 1 раз по кнопке у мя вставляется текст. Мне надо сделать так: поток читает тока "входящие сообщения" а на "исходящие не реагирует", как так сделать? вот код моего мега чата!!! (90% рабочий чат!!!!) ![]()
|
Автор: Мурлыкатам_ 13.6.2007, 07:02 | ||
Решил я самостоятельно вопрос повторений, следующим образом, короче все вопросы я решил ![]()
|
Автор: Мурлыкатам_ 19.6.2007, 00:16 | ||
Все сдал курсач )) 10 баллов. вот код:
|