Ponch |
Отправлено: 27.05.2003, 12:25 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
Народ!
Как программно реализуется сообщение по сети(какой ф-цией)?
Что-то наподобие консольной команды NET SEND ...
И под какие ОС работает?
Интересует возможность след. направлений передачи: Win9х -> Win2К
Win9х -> Win9х, Win2К -> Win2К. |
|
Anry |
Отправлено: 27.05.2003, 13:04 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 56
|
Сам еще ни разу не пробовал, могу только подсказать направление. Насколько мне известно данная фишка реальзуется с помощью сокетов.
1. Необходимо определить IP-адрес компьютера-приемника. Делается это с помощью API функции GetHostByName.
2. Создается сервер на основе компонента TServerSocket, к которому подключается клиент TClientSocket.
Далее думаю ты сам разберешься.
|
|
Ponch |
Отправлено: 27.05.2003, 14:45 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 12
|
Я, наверное, не совсем доступно объяснил .
Мое прога работает в серверной комнате(где никого нет). Если происходит целевое событие (например, какая-то ошибка), то хотелось бы сообщить об этом на админский ПК простой месагой — обычным MessageBox'ом. Т.е. на админском компе никаких моих прог-сканеров нет. По этому принципу работает отсылка сообщений под NT/2K — NET SEND , т.е. "выскакивает" обычный MessageBox на заданном .
Думаю, наверняка есть соотв. API-функция. Но я ее не знаю |
|
Dr.Phoenix |
Отправлено: 27.05.2003, 23:20 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 48
|
Devnvd на старом форуме писал
QUOTE |
Послать сообщение вы сможете так. Это работает.
Обратите внимание, что текст необходимо перекодировать в OEM,
так как стандартные WinPopup сделают при приёме автоматом
перекодировку OEM->ANSI, незадумываясь о том в какой
кодировке к ним пришло сообщение.
|
CODE |
bool SendNetMessage(AnsiString Komp, AnsiString Mes)
{
AnsiString From;
char CompName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD size=MAX_COMPUTERNAME_LENGTH + 1;
//Откуда
if(!GetComputerName(CompName,&size))return false;
From=CompName;
if(Mes.Length()==0)return false;
HANDLE hSlot = CreateFile(("\\\\"+Komp+"\\mailslot\\messngr").c_str(),
GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSlot == INVALID_HANDLE_VALUE)return false;
DWORD cb=0;
BOOL ret;
char *buf=new char[From.Length()+1+Komp.Length()+1+Mes.Length()+1];
//1. From
memcpy(&buf[cb],From.c_str(),From.Length()+1);
cb +=From.Length()+1; //+1 на конце должен быть 0
//2. To
memcpy(&buf[cb],Komp.c_str(),Komp.Length()+1);
cb +=Komp.Length()+1;
//3. Само сообщение
memcpy(&buf[cb],Mes.c_str(),Mes.Length()+1);
cb +=Mes.Length()+1;
//ConvertToDos
CharToOemBuff(buf,buf,cb);
ret=WriteFile(hSlot, buf,cb, &cb, NULL);
CloseHandle(hSlot);
delete[] buf;
if(!ret) return false;
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Komp,Mes;
//Кому
Komp=Edit1->Text;//Name PC
//Сообщение
Mes=Edit3->Text; //Message
StatusBar1->Panels->Items[0]->Text="";
bool ret=SendNetMessage(Komp,Mes);
if(ret)
StatusBar1->Panels->Items[0]->Text="Message send succesfully";
else
StatusBar1->Panels->Items[0]->Text="Message no send";
}
|
Работает в режиме NT->NT, 9x->NT, NT получает сообщение только если работает сервис Messenger'а
Отредактировано Dr.Phoenix — 27 May 2003, 23:28
|
|
Anry |
Отправлено: 28.05.2003, 11:13 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 56
|
Мне кажется команда Net Send и работает с WinSocket. Все API функции по сокетам хранятся в wsocks32.dll (WinSocket 1.1) или ws_32.dll (WinSocket 2.0). Выдрать их можно с помощью impdef, которая находится в каталоге bin Builder'а. В принципе я видел как это делается с помощью сокетов, ничего сложного нет. Думаю, что по этой технологии и создаются разные чаты для локальной сети.
|
|
|