INTERNET PACKET EXCHANGE/SEQUENCED PACKET EXCHAGE

Tuğba EKİNCİ (tugba.ekinci@students.comu.edu.tr)

Burak UYGUR (burak.uygur@students.comu.edu.tr)

Çanakkale Onsekiz Mart Üniversitesi,

Bilgisayar Mühendisliği Bölümü

07/05/2003


Bu belgede, IPX/SPX paketlerinin yapısı ve özellikleri anlatılmıştır.


İÇİNDEKİLER


1.Giriş

2.IPX Protokolüne Genel Bir Bakış

    - IPX Paket Yapısı 
    - IPX Adresleri

3.SPX Protoküne Genel Bir Bakış

    - SPX Paket Yapısı
    - Çift Taraflı İletim
    - SPX Bağlantı Yönetimi
    - SPX Akış Kontrolü
 

4.Bazı Kısaltmalar

  

5.Kaynak Kodlar 

 

6.Kaynaklar

 

7.Yasal Açıklamalar 


1.GİRİŞ


IPX/SPX yani Internet Packet Exchange/Sequenced Packet Exchange Novell tarafindan gelistirilen bir protokol kümesidir. Novell'in çikarmis oldugu ağ isletim sistemlerinde Netware 5 hariç varsayilan protokol kümesi olarak gelir.IPX/SPX diğer ağ iletişim protokolleri gibi tek bir protokol değil, bilgisayarları birbirine bağlayan bir standart prosedürler kümesidir.

Pratikte her protokol seti, mesajı veya paketi adresleme, alındı veya yönledirme bilgisi gibi belirli yapıda biçimlendirir.Protokolün IPX bölümü NetWare düğümleri arasında paketlerin adreslenmesiden sorumludur.Genelde DOS/WINDOWS uygulamaları tarafından istenen nispeten küçük paketleri için hızlı ve verimlidir ayrıca ağa az yük iletir.Küçük veri paketleri için daha yavaş ve pahalı ağ içi hatlara sahip geniş alan ağlarda arzu edilmez çünkü aşırı yük eklerler.

Novell protokolleri ile OSI modeli arasindaki iliski asagidaki sekilde gösterilmistir:

                                 

IPX : IPX baglantisiz (connectionless) bir protokol olup üst katman protokolleri ile haberlesirken socket'leri kullanir.

SPX : Bağlantı temelli (connection-oriented) bir protokoldür. Bağlantı kurulan iki uç sistem arasinda güvenilir bir iletisimi garanti eder.

RIPX (Routing Information Protocol): Uzaklik-vektör temelli bir yönlendirme protokolu olan RIPX, IPX üzerinde de çalisir.İnternette geçit yolları arasında doğru yönlendirme bilgisini toplama ve değiştirme gibi işlemleri vardır.

SAP (Service Advertising Protocol): Servis duyurmak ve servis istemek için kullanilir. Sunucular istemcilere bunu kullanarak bir servisi teklif eder ve istemciler de bunu kullanarak network servislerinin yerini belirlerler.

BCAST (Broadcast Protocol):Ağdaki anonsları bildirir ve kullanıcılara mesaj aldıklarına dair bilgi verir.

DIAG (Diagnostic Responder Protocol):NetWare yerel alan ağlarının analizi için kullanılırlar.Bağlantı testi, konfigürasyon ve bilgi toplanması için kullanışlıdırlar.

WDOG (Watchdog Protocol):Aktif bağlantıların geçerliliğini sağlar.

BMP (Burst Mode Protocol):İstemci/sunucu bağlantılarının hız ve verimliliğini arttırır.

NLSP (Netware Link Services Protocol): Novell tarafindan gelistirilen baglanti durumu (link-state) temelli bir yönlendirme protokolüdür.

NCP (Netware Core Protocol): Istemcilerin sunucu kaynaklarina erismelerini saglar. NCP'nin baslica fonksiyonlarinin basinda file access, printing, security gelir. Tüm Netware istemciler network üzerindeki kaynaklari bulmak için sunucuya ihtiyaç duyarlar. Netware sunucularda ise SAP tablolari bulunur ve bu tabloda network'te bulunan ve haberdar olduklari kaynaklara ait bilgiler tutulur. Istemciler bu kaynaklara erismek istediklerinde GNS (GetNearestServer) istedigi olarak adlandirilan bir IPX broadcast yayinlarlar. Bu mesaji alan sunucular kendi SAP tablolarini kontrol ederek uygun bir cevapla GNS mesajini cevaplarlar. Bu GNS mesajinda istemciye uygun sunucunun bilgisi gönderilir. Cisco router'larda da SAP tablosu olusturulur ve istemcilerden gelen GNS isteklerine Cisco router'lar da cevap verebilir.

Netware sunucular 60 sn.'de bir SAP broadcast yayini yaparlar ve bu yayinlar sunucunun diger sunuculardan ögrendigi tüm servisleri içerir.


2. IPX PROTOKOLÜNE GENEL BİR BAKIŞ


IPX, bilgisayar ağlarının birbirleriyle olan iletişiminde adresleme ve yölendirme servisleri ile NetWare işistasyonlarını ve dosya sunucularını sağlayan bağlantısız datagram protokolüdür.OSI'nin 3. katmanı olan ağ katmanı karşılığı IPX, bir sistem başka bir LAN'daki sisteme veri paketi gödereceği zaman, yönlendirme işini gerçekleştirir.

 

 IPX paket yapısı aşağıda gösterilmiştir:

 

0

15 bit

 

 

Hata Sınama Bitleri(Check Sum)

 

 

Paket Uzuluğu(Packet Length)

Netware

IPX

Başlığı

İletim Kontrolü

Paket Tipi

Alıcı Ağı(Destination Network)

(4 byte)

Alıcı Düğümü(Destination node)

(6 byte)

Alıcı Soketi(Destination socket)

Gönderici Ağı(Source network)

(4 byte)

Gönderici Düğümü(Source node )

(6 byte)

Gönderici Soketi(Source socket)

(2 byte)

 

Veri(RIP, SAP, SPX, NCP, vb.bilgiler içeren)

 

 

                                                        IPX paket yapısı

 Hata Sınama Bitleri: Verinin ve başlığın hatasız aktarılıp aktarılmadığını sınamak için kullanılır.16 bitliktir.

 Paket Uzunluğu: IPX paketinin komple uzunluğunun ifadesi için kullanılır.(42-576 byte)

 İletim Kontrolü:NetWare yönlendiricileri tarafından kullanılır. Paket iletiminden önce IPX tarafından 0 olarak belirlenir.

 Paket Tipi: Bu alan otomatik olarak doldurulur.Paket bilgilerini belirtir:

 

                                     

Alıcı Adresi(Destination address):Bir bağlantı kurulurken, paket, 12 byte'lık IPX yapısı  olan alıcı adresine sahip olmalıdır.SPX alıcı adresini, diğer uç noktasının (alıcının) adresiyle doldurur.

Alıcı adresleri,  ağ adresi, düğüm adresi ve soket adresinden oluşur.                                                                                                                                                             

Gönderici Adresi(Source Adresi):Alıcı adresi gibi, ağ, düğüm ve soket alanlı 12 byte'lık IPX adresidir.

IPX ADRESLERİ

TCP/IP adreslerindeki hiyerarsik yapi IPX adreslerinde de vardir.Bir IPX adresi 4 byte Ağ Numarası, 6 Byte Uç Numarası, 2 Byte Soket Numarasından oluşur. 

 

Ağ(Network) Numarası:Ağ yöneticisi tarafından belirlenen 32 bitlik bir sayıdır.Yerel ağda 0 olarak saptanır.IPX bilgisayar ağlarının birbirleri ile olan iletişiminde (internetworking) yerel alan ağını ya da belirli bir ağı ifade eder. Bir IPX ağında bu numara tek olmalidir.

Uç(Node) Numarası: Yerel alan ağları donanım adreslerini tanıyan 48 bitlik bir sayıdır.Bir ağ üzerindeki bilgisayarları ya da ağ bileşenlerini ifade eder. Node adresi herbir host için otomatik olarak atanir ve bu adres host'un MAC adresidir.Eğer düğüm numarası FFFF FFFF FFFF ise broadcast, düğüm numarası 0000 0000 0001 ise sunucu anlamına gelir.(sadece NetWare 3.x ve 4.x 'de)

 Soket(Socket) Numarası:Büyük katman paketlerini tanıyan 16 bitlik bir sayıdır:Düğüm içindeki işlemleri ifade eder.Bir soket tek bir sayıyla belirtilir.

 

                               

IPX, alıcı ağına paketi göndermek için ağ adresini gönderir.Düğüm adresi, paketi alan düğümü ya da istemciyi tanır.IPX, paketi SPX'e vermek için paket tipini kullanır.SPX, gelen pakete uygun işlemi tanımlamak için soket numarası ve alıcı bağlantı ID'sini kullanır.

 

Uç numarası genellikle arabirim kartının donanım adresi olup, ağ içinde benzersiz olması gereklidir. IP' de olduğu gibi ağ numarasının, belirli bir segmentte, tüm uçlarda aynı olması gereklidir. Soket numarası ulaşılan belirli bir servise karşılık gelir. Aşağıdaki IPX ağını ele alalım:

          

                                            

                                                                            1A2B3C4D ve DDEEAADD ağları

A ve D uçları Netware işistasyonları, B, C ve E uçları Netware sunucularıdır. C ucu iki tane ethenet arabirine sahip olup, iki ağ arasında yönlendirci gibi davranmaktadır.

Netware sunucuları, yönlendirme bilgisini ve servis duyurularını ağ segmentindeki tüm uçlara RIP/SAP veya NLSP' yi kullanarak yayınlamaktadır. C ucu bu bilgiyi bağlı ağlara iletmektedir ve böylece tüm uçların var olan tüm dosya ve yazıcı sunucularının adreslerinden ve tüm sunucuların da diğer sunuculara yönlendirmelerden haberdar olmaları sağlanmaktadır.

Bir sunucu üzerinde çalışan bir servisi adreslemek için, her sunucu IPX başlığında ağ adresi sahasında bululnan kendi dahili ağ numarasına sahiptir.

        - Ethernet

        - Token Ring   

        - FDDI

                             

 

 

 

 

Ayni IPX network'teki host'larin birbiriyle iletisim kurabilmesi için aynı frame tiplerin kullanmaları gerekir.


3. SPX PROTOKOLÜNE GENEL BİR BAKIŞ


SPX, bir ulaşım katmanı protokolü olup bağlantıya yönelik çalışır, sıralı paketleri kullanarak iki düğüm arasındaki iletişimi sağlar.SPX paket numaralama sistemi, SPX bağlantısı kurulduğunda belirlenir; sıra ve onay numarası 0 olarak saptanır.

İki düğüm arasında paket gönderimi devam ederken , düğümler her paket için sıra ve onay numarası uyumunu arttırır.Bu demek oluyor ki, bir bağlantı kurulduğunda sonraki her SPX paketi şimdiki sıra ve onay numaralarıyla gösterilir.Bu yolla sıra ve onay numaraları kullanımı, uç noktalar arsındaki iletişimi senkronize eder.Başarılı iletim doğrulanır çünkü onay numarası sıralı paketteki diğer sayıyı gösterir ve böylece uyumlu numaralı veri paketini ister.

Ayrıca sıralı paketler, SPX 'in kaybolmuş veya durdurulmuş paketleri aşağıdaki gibi ortaya çıkarmasına imkan sağlar:

SPX Paket Yapısı

Bir SPX paketi 0'dan 534 byte'a kadar verinin izlediği 42 byte'lık bir SPX başlığı içerir.Minumum SPX paket boyutu 42 byte'dır (sadece başlık) ve maksimum boyutu 576 byte'dır (başlık ve verinin 534 byte'ı).

                                                                   

Bağlantı Kontrolü(Connection Cotrol):Bu alan SPX alan başlığı içindedir.SPX bu alanı, paketin bir sistem mi yoksa uygulama veri paketi mi olduğunu belirlemek için kullanır.Sistem paketleri, veri paketlerini aldıklarını bildirmek için, uygulama veri paketleri ise veriyi gödermek için kullanılırlar.

SPX Bağlantı Kontrolü İçin Bayraklar;

Veri Akışı Tipi(Datastream Type):SPX bu alanı ya bağlantının sonunu (0xFE) ya da onay bağlantısının sonunu (0xFF) belirlemek için kullannılır. SPX bu alanda diğer değerlere önem vermez.

0-253: Önemsenmez          254: Bağlantı sonu        255: Onay bağlantısı sonu

Gönderici Bağlantı ID'si(Source Connection ID):SPX, bağlantı kurulduğu sırada gönderici bağlantı tanımlama alanı için tanımlama numarası oluşturur.Paketin gönderici son noktası değerini saptar. SPX alıcı ve gönderici bağlantı ID numarasını, aynı sokete varan bir çok bağlantıdan, paketleri, demultiplex etmek için kullanılır. Verilen düğümdeki bütün aynı zamanda oluşan aktif bağlantılar yalnız bir tane bağlantı ID numarasına sahip olurlar.

Sıra Numarası(Sequence Number):SPX bu alanı gönderilen veri paketlerinin sıra numarasını takip eden bir sayaç olarak kullanır.Bağlantının her yönü kendi sıra sayacını tutar.

Onay Numarası(Acknowledge Number):Diğer uç noktadan beklenen sonraki paketin sıra numarasını belirlemek için kullanılır.Bu numara diğer veri paketi alınana dek sabit kalır.Alıcı, veri paketinin alındığını belirtmek için bu alanı arttırır. SPX, belirlenen onay numarasından daha az miktardaki sıra numaralı veri paketini durdurur.SPX ikili paket aldığında paketin onayını geri gönderir.Böyle belirlenen onay numarasından az miktarda sıra numaralı herhangi bir paket SPX tarafından doğru biçimde alınır ve yeniden iletilmez.

Ayırma Numarası(Allocation Number):SPX bu alanı iletim uygulamaları arasındaki akış kontrolünü yerine getirmek için kullanılır. Alıcı uç nokta, gönderici uç nokta tarafından denetlenmiş bu numarayı tutar.SPX, paketleri sadece yerel sıra numarası ayırma numarasına eşit oluncaya dek gönderir.


 

Çift Taraflı İletim

 Gönderici düğüm, veri içeren SPX paketlerini göderir.SPX başlığı onay bit grubuna sahiptir.Alıcı düğüm, veri paketinin alındığını ve sıradaki paketin iletebileceğini belirten onay paketiyle(ACK) karşılık verir.ACK paket başlığı SYS bit grubuna sahiptir.SPX istemcisi veri paketlerini bir SPX sunucusuna gönderir ve göderilen her paket için bir onay paketi ister.

 

SPX Bağlantı Yönetimi

 SPX'in IPX'e olan bağlantısı NPSD (NetWare Protocol Stack Daemon) tarafından yaratılır.Eğer NPSD'ye birşey olursa, IPX ve SPX bağlantı mimarisi   çöker.Bağlantı çöktüğünde, SPX giden veriyi durdurur.Kırık ya da inaktif bağlantıları temizlemek için SPX watchdog'ları ve timeout prosedürleri kullanır.

 

SPX Akış Kontrolü

Akış kontrolü, paketlerin hangi hızla alındığını ve gönderildiğini ayarlar.SPX iletimdeki uygulamalar arasındaki akış kontrolünü, ayırma numarasını (başlıktaki) saptayarak yerine getirir.Gönderici ayırma numarasını denetler ve paketleri sıra numarası ayırma numarasına eşit olduğunda gönderir.

 Gelen Veride Akış Kontrolü: Eğer bir uygulama veriyi göndericinin gönderdiği hızda alamazsa, SPX (alınan tarafta) son alınan veriyi kabul eder.SPX (gönderilen tarafta) yeniden denenmesi için sıraya sokar.

Giden Veride Akış Kontrolü: SPX uzak iletim yapıyorsa, uç nokta veriyi alır ama SPX alım penceresini kapatan ayırma numarasını arttırmaz.Gönderici aşağıdaki koşulların biri için bağlantıyı denetler:

· Eğer uzak iletim noktası pencereyi yeniden açarsa, SPX veri yollamaya devam eder.

· Eğer uzak iletim noktası aktifliğini kaybederse, SPX sıradaki bütün verileri keser.

· Eğer uzak iletim noktası aktif ama veriyi alamayacak durumdaysa, SPX watchdog bağlantıyı denetlemeye devam eder ve, ya nokta inaktif olana kadar    ya  da belirsiz zaman onu açık durumda tutar.

 


 

4. BAZI KISALTMALAR

 


 

· RIPX - Routing Information Protocol.

· BCAST - Broadcast.

· DIAG - Diagnostic Responder.

· SER - Serialization.

· WDOG - Watchdog.

· SAP - Service Advertising Protocol.

· BMP - Burst Mode Protocol.

· NCP - NetWare Core Protocol.

· NDS - NetWare Directory Services.

· RIP - Routing Information Protocol

· NLSP - Netware Link Services Protocol

 


 

5. KAYNAK  KODLAR  

 


#include

#include

#include

#include

#include

#include

typedef unsigned char BYTE;

typedef unsigned short WORD;

typedef unsigned long LONG;

typedef struct IPXPacketStructure

{

  WORD PacketCheckSum; /* high-low */

  WORD PacketLength; /* high-low */

   BYTE PacketTransportControl;

   BYTE PacketType;

   BYTE dNetwork[4]; /* high-low */

   BYTE dNode[6]; /* high-low */

   BYTE dSocket[2]; /* high-low */

   BYTE sNetwork[4]; /* high-low */

   BYTE sNode[6]; /* high-low */

   BYTE sSocket[2]; /* high-low */

}

IPXPacket;

typedef struct

{

   BYTE network[4]; /* high-low */

   BYTE node[6]; /* high-low */

}

localadr_t;

localadr_t localadr;

typedef struct ECBStructure

{

   WORD Link[2]; /* offset-segment */

   WORD ESRAddress[2]; /* offset-segment */

    BYTE InUseFlag;

    BYTE CompletionCode;

   WORD ECBSocket; /* high-low */

    BYTE IPXWorkspace[4]; /* N/A */

    BYTE DriverWorkspace[12]; /* N/A */

    BYTE ImmediateAddress[6]; /* high-low */

    WORD FragmentCount; /* low-high */

    WORD fAddress[2]; /* offset-segment */

    WORD fSize; /* low-high */

    WORD fAddress1[2];

    WORD fSize1;

 } ECB;

typedef struct

{

   ECB ecb;

   IPXPacket ipx;

   int Type;

   int InfoSize;

   char Info[ 200 ];

 } PKT;

 PKT pkt[4];

 #define TALKCMD 0x1234

#define TALKECHO 0x4321

#define QUITTALK 0x2222

unsigned socketid=0x869c;

union REGS regs;

struct SREGS sregs;

int OpenSocket(short socketNumber)

{

   regs.x.bx = 0;

   regs.h.al = 0; // longevity

   regs.x.dx = socketNumber;

   int86(0x7A,®s,®s);

   if (regs.h.al) printf ("OpenSocket: 0x%x",regs.h.al);

   return regs.x.dx;

 }

 void CloseSocket(short socketNumber)

{

   regs.x.bx = 1;

   regs.x.dx = socketNumber;

   int86(0x7A,®s,®s);

 }

 void ListenForPacket(PKT *packet)

 {

   memset (packet,0,sizeof(PKT));

   packet->ecb.InUseFlag = 0x1d;

   packet->ecb.ECBSocket = socketid;

   packet->ecb.FragmentCount = 2;

   packet->ecb.fAddress[0] = FP_OFF(&(packet->ipx));

   packet->ecb.fAddress[1] = FP_SEG(&(packet->ipx));

   packet->ecb.fSize = sizeof(IPXPacket);

   packet->ecb.fAddress1[0] = FP_OFF( &packet->Type );

   packet->ecb.fAddress1[1] = FP_SEG( &packet->Type );

   packet->ecb.fSize1 = 200;

   regs.x.si = FP_OFF(packet);

   regs.es = FP_SEG(packet);

   regs.x.bx = 4; int86x (0x7a,®s,®s,&sregs);

   if (regs.h.al) printf ("ListenForPacket: 0x%x",regs.h.al);

 }

 void GetLocalAddress (void)

{

   regs.x.si = FP_OFF(&localadr);

   sregs.es = FP_SEG(&localadr);

   regs.x.bx = 9;

   int86x (0x7a,®s,®s,&sregs);

   if (regs.h.al) printf ("Get inet addr: 0x%x",regs.h.al);

   printf( "My network number is %x:%x:%x:%x\n",localadr.network[0],localadr.network[1],localadr.network[2],localadr.network[3] );

   printf( "My node is: %x:%x:%x:%x:%x:%x\n", localadr.node[0],localadr.node[1], localadr.node[2],localadr.node[3], localadr.node[4],localadr.node[5] );

}

void SendPacket (PKT *packet)

{

   int i;

   packet->ecb.ECBSocket = socketid;

   packet->ecb.FragmentCount = 2;

   packet->ecb.fAddress[0] = FP_OFF(&(packet->ipx));

   packet->ecb.fAddress[1] = FP_SEG(&(packet->ipx));

   packet->ecb.fSize = sizeof(IPXPacket);

   packet->ecb.fAddress1[0] = FP_OFF( &packet->Type );

   packet->ecb.fAddress1[1] = FP_SEG( &packet->Type );

   packet->ecb.fSize1 = packet->InfoSize+4;

   for( i=0; i<6; i++ )

   packet->ecb.ImmediateAddress[i] = packet->ipx.dNode[i];

   packet->ipx.dSocket[0] = socketid&255;

   packet->ipx.dSocket[1] = socketid>>8;

   regs.x.si = FP_OFF(packet); sregs.es = FP_SEG(packet);

   regs.x.bx = 3; int86x (0x7a, ®s, ®s, &sregs);

   if (regs.h.al)printf ("SendPacket: 0x%x",regs.h.al);

 }

 /* ==================== = = InitNetwork = ==================== */

 int InitNetwork ( void )

{

    int i;

    regs.x.ax = 0x7a00;

    int86x (0x2f,®s,®s,&sregs);

    if ( regs.h.al != 0xff) { printf ("IPX not detected\n"); return 0; }

    else printf( "PASS1: IPX packet driver found!\n" );

    socketid = OpenSocket ( (socketid>>8) + ((socketid&255)<<8) );

    GetLocalAddress ();

    for( i=1; i< 4; i++ ) ListenForPacket (&pkt[i]); return 1;

 }

 void ShutdownNetwork (void)

{

   CloseSocket (socketid);

 } /* Send a packet and wait for remote echo. */

 int WaitForEcho( char *received )

{

   unsigned char lasttime;

   struct time t;

   int i;

   SendPacket( &pkt[0] );

   gettime( &t );

   lasttime = t.ti_sec;

   do {

   for( i=1; i< 4; i++ )

  {

     if( pkt[i].ecb.InUseFlag )

    {

       regs.x.bx= 0x0a;

       int86(0x7a,®s,®s );

     } else

       {

         if( memcmp( pkt[i].ipx.sNode, localadr.node, 6 ) )

        {

           if( pkt[i].Type == TALKCMD )

          {

             pkt[0].Type = TALKECHO;

           } else

              if( pkt[i].Type == TALKECHO )

             {

                pkt[0].Type = TALKECHO;

                memcpy( received, pkt[i].Info, pkt[i].InfoSize );

                SendPacket( &pkt[0] );

                return 1;

              } else

                 if( pkt[i].Type == QUITTALK ) ShutdownNetwork();

           }

           ListenForPacket( &pkt[i] );

      }

   }

   gettime( &t );

 }

 while( t.ti_sec==lasttime );

 return 0;

}

int FindNode( void )

{

   int i;

   if( InitNetwork() )

  {

    printf( "Trying to find a node to talk to. Press any key to abort.\n" );

    printf( "Looking for a node." );

    pkt[0].InfoSize = 10;

    memcpy( pkt[0].Info, localadr.network, 10 );

    pkt[0].Type = TALKCMD;

    memset( pkt[0].ipx.dNode, 0xff, 6 );

    memcpy( pkt[0].ipx.dNetwork, localadr.network, 4 );

    while( !kbhit() )

    {

       printf( "." );

       if( WaitForEcho( pkt[0].ipx.dNetwork ) )

      {

         printf( "\nFind a node from " );

         for( i=0;i<6;i++ )

         printf( "%x:",pkt[0].ipx.dNode[i] );

         return 1;

       }

     }

     printf( "\nAbort searching nodes by user!\n" );

     return 0;

    }

    else

   {

      exit(0);

      return 0;

     }

  }

  void RefreshSocket( void )

 {

     int i;

     CloseSocket( socketid ); // regs.x.bx= 0x0a; //

     int86(0x7a,®s,®s );

     OpenSocket( socketid );

     for( i=1; i< 4; i++ )

     ListenForPacket (&pkt[i]);

   }

   char remotenode[6];

   char remotename[200];

   char remoterow, remotecol;

   void main( void )

  {

     char i,key, x, y;

     int pass;

     int mycol;

     if( FindNode() )

    {

       RefreshSocket();

       printf( "\n\nWhat is your name? " );

       gets( pkt[0].Info );

       pkt[0].InfoSize = strlen( pkt[0].Info );

       pkt[0].Type = TALKCMD;

       printf( "Waiting for remote name." );

       while( !WaitForEcho( remotename ) )

       printf( "." );

       RefreshSocket();

       regs.x.ax = 0x03;

       int86( 0x10, ®s, ®s );

       printf( "========== IPX Talker Version 0.===============" );

       gotoxy( 1,13 );

       printf( "----------<< %15s >>------ V.S.------<< %15s >>-----------", pkt[0].Info, remotename );

       mycol = 2;

       remotecol = 14, remoterow = 1;

       pkt[0].InfoSize = 1;

       gotoxy( 1, 2 );

       while( inportb(0x60)!=1 )

      {

         key = 0;

         if( kbhit() )

        {

           regs.x.ax = 0x01;

           int86( 0x16, ®s, ®s );

           pkt[0].Info[0] = regs.h.al;

           if( regs.h.al )

          {

             if( regs.h.al == 13 )

            {

              mycol++;

              if( mycol > 12 ) mycol = 2;

              gotoxy( 1, mycol );

              printf( "%80s", "" );

              gotoxy( 1, mycol );

            }

           else if( regs.h.al == 8 )

           {

              printf( "%c %c", 8, 8 );

            }

           else printf( "%c", regs.h.al );

         }

         pkt[0].Type = TALKCMD;

         while( !WaitForEcho( &key ) );

         RefreshSocket();

        }

        else

       {

          pkt[0].Info[0] = 0;

          for( i=1; i< 4; i++ )

         {

            if( pkt[i].ecb.InUseFlag )

           {

              regs.x.bx= 0x0a; int86(0x7a,®s,®s );

            } else

              {

               if( pkt[i].Type == TALKCMD )

               {

                 pkt[0].Type = TALKECHO;

                 key = pkt[i].Info[0];

                 pkt[0].Info[0] = 0;

                 SendPacket( &pkt[0] );

                } else

                   if( pkt[i].Type == QUITTALK ) goto QuitIPX;

                   ListenForPacket( &pkt[i] );

               }

            }

         }

         if( key )

         {

            x = wherex(); y = wherey();

           if( key==13 )

           {

              remotecol++;

              if( remotecol > 24 ) remotecol = 14;

              gotoxy( 1, remotecol );

              printf( "%80s", "" );

              gotoxy( 1, remotecol );

              remoterow = 1;

             } else

               if( key==8 )

               {

                  gotoxy( remoterow--, remotecol );

                  printf( "%c ", 8 );

                } else

                  {

                     gotoxy( remoterow++, remotecol );

                     printf( "%c", key );

                   }

                   gotoxy( x, y );

            }

          }

          pkt[0].Type = QUITTALK;

          SendPacket( &pkt[0] );

          QuitIPX: regs.x.ax = 0x03;

           int86( 0x10, ®s, ®s );

       }

       ShutdownNetwork();

       printf( "Thank you for using IPX TALKER v0.1!!\n" );

   }

 

 


 

6. KAYNAKLAR

 


 

1-Rıfat Çölkesen - Network TCP/IP Unix El Kitabı

2-The Novell NetWare Protocols - www.protocols.com

3-IPX/SPX Tutorial - www.digital-angles.org

4-Networking Protocols - http://metalab.unc.edu

 


7. Yasal Açıklamalar


Bu belgenin, 0.1 sürümünün telif hakkı © 2003 Tuğba EKİNCİ ve Burak UYGUR'a aittir.

Bu belgedeki bilgilerin kullanımından doğacak sorumluluklar, ve olası zararlardan belge yazarı sorumlu tutulamaz. Bu belgedeki bilgileri uygulama sorumluluğu uygulayana aittir.

Tüm telif hakları aksi özellikle belirtilmediği sürece sahibine aittir. Belge içinde geçen herhangi bir terim ya da bir ticarî isim, kuruma itibar kazandırma olarak algılanmamalıdır. Bir ürün ya da markanın kullanılmış olması ona onay verildiği anlamında görülmemelidir.