Форум программистов, компьютерный форум CyberForum.ru

Работа с mailslot - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Goran71
2 / 2 / 0
Регистрация: 21.11.2008
Сообщений: 67
22.05.2009, 22:54     Работа с mailslot #1
У меня такой вопрос возник... вот в описании Почтовых ящиков (mailslot) написано:
"Почтовые ящики обеспечивают только однонаправленные соединения. Каждый процесс, который создаёт почтовый ящик, является "сервером почтовых ящиков" (mailslot server). Другие процессы, называемые "клиентами почтовых ящиков" (mailslot client), посылают сообщения серверу, записывая их в почтовый ящик. Каждый процесс может одновременно быть и сервером и клиентом почтовых ящиков, создавая, таким образом, двунаправленные коммуникации между процессами"

т.е. чтобы мне создать например 1 сервер и у него будет 3 клиента мне нужно создать 2 почтовых ящика: "\\.\mailslot\ServerToClient" (в Си++ "\\\\.\\mailslot\\ServerToClient") и
"\\.\mailslot\ClientToServer" (в Си++ "\\\\.\\mailslot\\ClientToServer")
один для отправки от сервера к клиентам, а другой от клиента к серверу
или это как-то можно оптимизировать ???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2009, 22:54     Работа с mailslot
Посмотрите здесь:

C++ Чтение и запись чисел в mailslot
C++ Передача дескриптора текущего процесса через mailslot

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Metal_666_
15 / 15 / 2
Регистрация: 19.10.2009
Сообщений: 187
29.06.2011, 23:38     Работа с mailslot #2
Тебе нужно создать 1 ящик на сервере,чтобы туда посылали сообщения клиенты, и у каждого клиента по ящику, чтобы туда мог посылать сервер. Итого 1 сервеный + 3 клиентских = 4 ящика
Таким образом к серверу клиенты будут обращаться "\\\\.\\mailslot\\ClientToServer"
А сервер уже будет "\\\\.\\mailslot\\ServerTo[Какой-нибудь порядковый номер или еще чтото]Client"
И кстати не забудь при передаче сообщения серверу как то обозначать кто именно передал, можно например название ящика, если нужно конечно что то передать в ответ.
Это если рассматривать обычную модель клиент-сервер

Добавлено через 1 час 7 минут
Ой, что то я набрел на 100-летнюю тему=)))
mazahaker3000
0 / 0 / 0
Регистрация: 10.12.2010
Сообщений: 11
02.12.2011, 20:22     Работа с mailslot #3
Вот полностью рабочая программа роботы Mailslota

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <vcl.h>
#pragma hdrstop
#include <winbase.h>
#include <stdlib.h>
#include <lm.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
ComboBox1->ItemIndex=2;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    DWORD num,msg,read;
    char buf[512];
 
    bool ret = GetMailslotInfo(hMailsl,NULL,&msg,&num,NULL);
    if (ret == false)
    {
        if ( Application->MessageBox("Íåìîæëèâî îòðèìГ*ГІГЁ ВіГ*ôîðìГ*ö³þ ç³ ñëîòГ*!!!", NULL, MB_OK) != IDOK)
            throw;
        Timer1->Enabled = false;
        exit(-1);
    }
    if (num != 0)
    {
        if (ReadFile(hMailsl, buf, 512, &read, NULL))
        {
            Memo1->Lines->Add((AnsiString)buf);
        }
        else {
            if ( Application->MessageBox("Íåìîæëèâî ïðî÷èòГ*ГІГЁ ïîâ³äîìëåГ*Г*Гї!!!", NULL, MB_OK) != IDOK)
                throw;
            exit(-1);
        }
    }
    ListBox1->Items->SaveToFile("baza.cfg");
    ComboBox1->Items->LoadFromFile("baza.cfg");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    char *buf;
    DWORD writen;
    AnsiString sName;
    sName="\\\\" + ComboBox1->Text + "\\mailslot\\$Channel$";
    //sName = "\\\\.\\mailslot\\$Channel$";
    hWsl = CreateFile(sName.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hWsl == INVALID_HANDLE_VALUE)
    {
        if ( Application->MessageBox("Íåìîæëèâî ñòâîðèòè ñëîò äëÿ Г§Г*ГЇГЁГ±Гі!!!", NULL, MB_OK) != IDOK)
            throw;
        return;
    }
    buf = Memo2->Lines->GetText();
    WriteFile(hWsl, buf, strlen(buf) +1 , &writen, NULL);
    Memo2->Clear();
    Memo2->Lines->Add("Ïîâ³äîìëåГ*Г*Гї â³äïðГ*âëåГ*Г®");
 
    CloseHandle(hWsl);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
char *msName = "\\\\.\\mailslot\\$Channel$";
    hMailsl = CreateMailslot( msName, 0, 1000, NULL);
    if(hMailsl == INVALID_HANDLE_VALUE)
    {
        if ( Application->MessageBox("Íåìîæëèâî ñòâîðèòè MailSlot.", NULL, MB_OK) != IDOK)
            throw;
        exit(-1);
    }
    else (Memo1->Lines->Add("Ñëîò ñòâîðåГ*Г®"));
    Timer1->Interval = 1000;
    Timer1->Enabled = true;
    ComboBox1->Items->LoadFromFile("baza.cfg");
}
//---------------------------------------------------------------------------
Плюс добавляем пару строк в хедер файл чтобы было так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TMemo *Memo1;
        TMemo *Memo2;
        TMainMenu *MainMenu1;
        TTimer *Timer1;
        TButton *Button1;
        TComboBox *ComboBox1;
        TListBox *ListBox1;
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormShow(TObject *Sender);
private:    // User declarations
public:     // User declarations
        HANDLE hMailsl, hWsl;
        char *mas;
        char *buf;
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
vitaxa94
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 66
19.12.2013, 21:12     Работа с mailslot #4
Подскажите пожалуйста как скомпилировать эту программу в Visual Studio 2012. Буду очень признателен.
Заранее спасибо!
Metal_666_
15 / 15 / 2
Регистрация: 19.10.2009
Сообщений: 187
20.12.2013, 15:34     Работа с mailslot #5
Цитата Сообщение от vitaxa94 Посмотреть сообщение
Подскажите пожалуйста как скомпилировать эту программу в Visual Studio 2012. Буду очень признателен.
Заранее спасибо!
Судя по коду, это было написано в Borland C++ Builder, поэтому в MS VS любой версии - никак.
Yandex
Объявления
20.12.2013, 15:34     Работа с mailslot
Ответ Создать тему
Опции темы

Текущее время: 23:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru