HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Üzenet küldése a helyi hálózat másik számítógépére


Példaprogram letöltése

8590 bájt

A számítógépek hálózatba szervezésének megannyi előnye mellett kihasználhatjuk azt a lehetőséget, hogy képesek vagyunk a számítógépek között üzenetet váltani. Cikkünkben megvizsgáljuk, hogy milyen módszerrel tudjuk ezt megtenni. A megoldásban segítségül hívjuk a NetApi32.dll dinamikus könyvtár megfelelő metódusát. Példánkban – elkerülendő a közvetlen függvényhívás okozta nehézségeket – egy osztályt hozunk létre az üzenetküldés kezelésére.

A példaalkalmazásban az APIClass osztály metódusaiba burkoltuk az üzenetküldő funkciót. A forrás fájl fejlécében meg kell adnunk néhány hivatkozást, hogy elérjük a szükséges osztályokat:
using System.Runtime.InteropServices;
using System.Net;
using System.Net.Sockets;
Az üzenetküldés a Netapi32.dll állomány NetMessageBufferSend nevű metódusának meghívásával válik lehetővé. Az osztályban deklaráljuk a metódust:
[DllImport("NetApi32")]
public static extern int NetMessageBufferSend(uint ServerName,uint MsgName, uint FromName,uint Buffer,ulong BufferLen);
A függvényt első paraméterében kell megadni a függvényt hívó számítógép nevét, mely általában az a számítógép is, melyet az üzenet forrását reprezentáló harmadik paraméterben megadunk. Az első és a harmadik paraméterben NULL értéket megadva automatikusan a LOCALHOST helyettesítődik be üzenetküldőként.
A függvény második paraméterében adjuk meg a címzett számítógép nevét, vagy IP címét. A negyedik paraméter az üzenetet, az ötödik paraméter az üzenet hosszát tartalmazza.
Ezek ismeretében lássuk, hogyan is hívható meg a függvény.
Az osztály konstruktorában egy változóban eltároljuk a számítógépünk nevét:
public APIClass()
{
  localPC = Dns.GetHostName();
}
A függvény meghívása előtt a megadott karakterláncokat először át kell konvertálnunk UInt32 típusúra. Ennek érdekében szükségünk van egy függvényre. Annak érdekében, hogy a konverzió sikeres legyen, nem használhatjuk a Convert.ToUInt32 metódust. Helyette a kapott karakterláncot egy mutatónak adjuk át, mely már implicite átkonvertálható UInt32 típusúra.
unsafe private UInt32 StringToPtr(string str)
{
  UInt32 strPtr;
  fixed(char* ptr = str)
  {
    strPtr = (UInt32) ptr;
  }
  return strPtr;
}
A menedzselt típushoz nem-menedzselt mutató hozzárendelése csak a FIXED kulcsszó használatával lehetséges. A kulcsszó azonban csak az úgynevezett UNSAFE kontextusban használható. Ennek érdekében a metódusunkat az unsafe kulcsszóval kell megjelölni.
Ezt azonban a projekt tulajdonságainál engedélyeznünk kell, mégpedig a Build menüpontban az „Allow unsafe code blocks” értékét TRUE-ra kell állítanunk.
Az üzenet küldését a SendMsg metódusban végezzük el. A metódusban minden paramétert a megfelelő típusúra hozunk:
public int SendMsg(string srvName, string msg)
{
Létrehozunk egy IPHostEntry objektumot a host számítógép címének meghatározásához:
  IPHostEntry ip = new IPHostEntry();
Az üzenet hosszát UInt64 formátumban kell megadni:
  msgLength = (UInt64) msg.Length * 2;
A helyi számítógép a küldő, így annak nevét adjuk meg a localPtr változóban:
  localPtr = StringToPtr(localPC);
Az üzenetre UInt32 formátumban van szükség:
  msgPtr = StringToPtr(msg);
A célszámítógép nevét is UInt32 formátumban adjuk meg:
  ip = Dns.Resolve(srvName);
  toSrvName = ip.HostName;
  toPtr = StringToPtr(toSrvName);
Majd meghívjuk a NetMessageBufferSend metódust:
  status = NetMessageBufferSend(localPtr,toPtr,localPtr,msgPtr,msgLength);
  ...
}
Az Elküld gomb megnyomásakor már csak példányosítjuk az APIClass osztályt, és meghívjuk a SendMsg függvényt:
APIClass s = new APIClass();
s.SendMsg(textBox1.Text,textBox2.Text);
...

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 323. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |