C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
mailslot. прием сообщения, Не могу принять сообщение на mailslot
arhont
Отправлено: 27.10.2005, 14:59


Не зарегистрирован







Всем Здравствуйте!
помогите разобраться с такой проблемой:

Решил я разобраться в механизме передачи сообщений между ПК по сети,
типа net send. Нашел довольно много информации в инете, в 90% случаев
предлагают использовать майлслоты. Почитал — вродебы всё просто.
Начал делать:

Форма, на ней два мемо, 1- прием, 2 — передача. кнопка — отправить,
комбобокс — тут список названий компов в сети и таймер, для проверки сообщений.


CODE

void __fastcall TForm1::FormCreate(TObject *Sender)
{
char *msName = "\.\mailslot\messngr";
hMailsl = CreateMailslot( msName, 0, 1000, NULL);
if(hMailsl == INVALID_HANDLE_VALUE)
       {
       if ( Application->MessageBox("Can't lock mailslot!!!\nStop another program \nor stop messenger service.", NULL, MB_OK) != IDOK)
       throw;
       exit(-1);
       }
Timer1->Interval = 1000;
Timer1->Enabled = true;
}

тут всё понятно и работает.

вот функция опроса майлслота на предмет пришедших сообщений:
CODE

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("Can't GET mailslot Info!!!", 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("Can't Read mailslot!!!", NULL, MB_OK) != IDOK)
               throw;
               exit(-1);
               }
       }

}


а вот тут проблема, всё вродебв работает, но только если отправлять сообщения локально, тоесть если я отправляю сообщение из своей-же программы, то всё ОК. а если по сетке или еще както, то ничего не происходит. а во время отправки — ошибки.

вот ф-я отправки, причём на другие компы отправляется нормально. т.е.
ф-я отправки работает.
CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *buf;
DWORD writen;
AnsiString sName;
sName = "\\" + ComboBox1->Text + "\mailslot\messngr";
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("Can't create mailslot to write!!!", NULL, MB_OK) != IDOK)
       throw;
       return;
       }
buf = Memo2->Lines->GetText();
WriteFile(hWsl, buf, strlen(buf) +1 , &writen, NULL);
CloseHandle(hWsl);
}

Вобщем вопрос такой — нужно чтобы работал прием сообщений не только локально, но и по сети.
Заранее спасибо.
Guest
Отправлено: 27.10.2005, 15:14


Не зарегистрирован







С приемкой не подскажу — не занимался, а при отправке через файл To_Name\mailslot\messngr часто бывают проблемы. Для систем 2k и выше лучше использовать функцию NetMessageBufferSend. Прослушкой занимается служба Meesendger и надо поискать инфу о ней.

Вернуться в Вопросы программирования в C++Builder