Conectarea clienților cu o conductă numită

Înainte de a vă conecta la o conductă numită, clientul trebuie să determine dacă există o instanță a acestui canal disponibilă pentru conexiune. În acest scop, clientul trebuie să apeleze funcția:







LPCTSTR lpNamedPipeName, // indică numele canalului

DWORD nTimeOut // interval de așteptare

care, dacă reușește, returnează TRUE, iar în caz de eșec, FALSE. Parametrii acestei funcții au următoarele semnificații.

Parametrul lpNamedPipeName specifică un șir care ar trebui să arate ca

aici indică numele computerului pe care rulează serverul de țevi numit.

Parametrul nTimeOut specifică intervalul de timp în care clientul așteaptă să comunice cu serverul. Acest interval de timp este definit în milisecunde sau poate fi una dintre următoarele valori:

· NMPWAIT_USE_DEFAULT_WAIT Intervalul de expirare este determinat de valoarea parametrului nDefaultTimeOut, care este specificată în funcția CreateNamedPipe,

· NMPWAIT_WAIT_FOREVER un interval de timp infinit pentru comunicarea cu o conductă numită.

Să facem două remarci importante cu privire la funcționarea funcției WaitNamedPipe. În primul rând, în cazul în care nu există cazuri de o țeavă numit cu numele lpNamedPipe, această funcție nu imediat, indiferent de timpul de așteptare setat nTimeOut. În al doilea rând, în cazul în care un client este conectat cu un canal la funcția ConnectNamedPipe serverul de apel, atunci funcția WaitNamedPipe returnează FALSE valoarea și funcția GetLastError returnează codul ERROR_PIPE_CONNECTED. Prin urmare, funcția WaitNamedPipe ar trebui să fie numit numai după conexiune la server cu un canal prin funcția ConnectNamedPipe.

După detectarea unei instanțe libere a canalului, pentru a stabili comunicarea cu acest canal, clientul trebuie să apeleze funcția

LPCTSTR lpFileName, // indică numele canalului

DWORD dwDesiredAccess. // citiți sau scrieți pe canal

DWORD dwShareMode, // modul de partajare

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // atributele de securitate

DWORD dwCreationDisposition, // flag de descoperire a canalului

DWORD dwFlagsAndAttributes, // steaguri și atribute

HANDLE hTemplateFile // atribute suplimentare

care, dacă reușește, returnează descriptorul pipei numite și dacă aceasta nu reușește, valoarea este INVALID_HANDLE_VALUE.







Parametrii funcției CreateFile pot lua următoarele valori dacă această funcție este utilizată pentru a deschide o conductă numită.

Parametrul lpFileName trebuie să indice numele canalului, care trebuie specificat în același format ca și funcția WaitNamedPipe.

Parametrul dwDesiredAccess poate lua una dintre următoarele valori:

· 0 permite obținerea atributelor de canal,

· GENERIC_READ permite citirea de pe canal,

· GENERIC_WRITE permite scrierea pe canal.

Trebuie remarcat faptul că funcția CreateFile nu reușește în cazul în care accesul la o conductă pe nume, aceste valori prestabilite nu corespunde valorilor parametrilor funcției dwOpenMode CreateNamedPipe. În plus, în această opțiune programator poate defini drepturi de acces standard, la o conductă de nume. Pentru mai multe informații despre această problemă, consultați MSDN.

Parametrul dwShareMode specifică modul de partajare al țevii numit și poate fi setat la 0, care neagă partajarea unei pipe numit sau orice combinație a următoarelor valori:

· FILE_SHARE_READ permite citirea partajată din canal,

· FILE_SHARE_WRITE permite partajarea în canal.

Parametrul lpSecurityAttributes specifică atributele de securitate ale unei conducte numite.

Pentru o conductă numită, parametrul dwCreationDisposition trebuie să fie egal cu valoarea OPEN_EXISTING, deoarece clientul deschide întotdeauna o conductă numită deja.

Pentru o conductă numită, parametrul dwFlagsAndAttributes poate fi setat la 0, care specifică parametrii și atributele implicite. Pentru informații detaliate despre valorile acestui parametru, consultați MSDN.

Valoarea parametrului hTemplateFile este setată la NULL.

Facem următoarele observații cu privire la lucrul cu funcția CreateFile dacă este folosit pentru a deschide accesul la o conductă numită. În primul rând, deși funcția WaitNamedPipe poate fi terminată cu succes, un apel ulterior la funcția CreateFile poate eșua din următoarele motive:

Între apelurile către aceste funcții, serverul a închis canalul,

Între apelurile pentru funcții, un alt client a contactat instanța acestui canal.

Pentru a preveni acest lucru, serverul trebuie să creeze o nouă instanță a conductei numite după fiecare finalizare cu succes a funcției ConnectNamedPipe sau să creeze mai multe instanțe ale conductei numite. În al doilea rând, dacă știți în prealabil că serverul numit funcția ConnectNamedPipe, funcția CreateFile poate fi apelată fără a apela mai întâi funcția WaitNamedPipe.

În plus, trebuie remarcat faptul că dacă clientul rulează pe aceeași mașină ca serverul și utilizează numele serverului pentru a deschide conducta numită în funcția CreateFile:

sistemul de fișiere al conductelor numite (NPFS) deschide această conductă numită în modul de transfer de date prin flux. Pentru a deschide o conductă numită în modul de transmitere a datelor prin mesaje, trebuie să setați numele serverului în formular:

Observăm un punct care se referă la conectarea serverului cu clientul canalului numit. Este posibil să apară o situație în care serverul numit funcția ConnectNamedPipe și clientul care dorește să comunice cu pipe-ul numit nu există. În acest caz, aplicația server va fi blocată. Pentru a putea gestiona această situație, trebuie să apelați funcția ConnectNamedPipe într-un fir separat de pe aplicația server. Apoi, pentru a debloca aplicația server, puteți apela o funcție pentru a asocia un client cu o țeavă numită dintr-un alt fir.







Trimiteți-le prietenilor: