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

 
Сообщение по сети
Ponch
  Отправлено: 27.05.2003, 12:25


Ученик-кочегар

Группа: Участник
Сообщений: 12



Народ!
Как программно реализуется сообщение по сети(какой ф-цией)?
Что-то наподобие консольной команды NET SEND ...
И под какие ОС работает?
Интересует возможность след. направлений передачи: Win9х -> Win2К
Win9х -> Win9х, Win2К -> Win2К.
Anry
  Отправлено: 27.05.2003, 13:04


Дежурный стрелочник

Группа: Участник
Сообщений: 56



wink.gif Сам еще ни разу не пробовал, могу только подсказать направление. Насколько мне известно данная фишка реальзуется с помощью сокетов.

1. Необходимо определить IP-адрес компьютера-приемника. Делается это с помощью API функции GetHostByName.
2. Создается сервер на основе компонента TServerSocket, к которому подключается клиент TClientSocket.
Далее думаю ты сам разберешься.
Ponch
Отправлено: 27.05.2003, 14:45


Ученик-кочегар

Группа: Участник
Сообщений: 12



Я, наверное, не совсем доступно объяснил wink.gif .
Мое прога работает в серверной комнате(где никого нет). Если происходит целевое событие (например, какая-то ошибка), то хотелось бы сообщить об этом на админский ПК простой месагой — обычным MessageBox'ом. Т.е. на админском компе никаких моих прог-сканеров нет. По этому принципу работает отсылка сообщений под NT/2K — NET SEND , т.е. "выскакивает" обычный MessageBox на заданном .
Думаю, наверняка есть соотв. API-функция. Но я ее не знаю sad.gif
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'а. В принципе я видел как это делается с помощью сокетов, ничего сложного нет. Думаю, что по этой технологии и создаются разные чаты для локальной сети.

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