Aracılığıyla paylaş


Sunucu Ana Bilgisayar Sistemlerini Bulma

Sunucu konak sistemi, dağıtılmış uygulamanın sunucu programını yürüten bilgisayardır. Ağda bir veya birden çok sunucu konak sistemi olabilir. İstemci programınızın bağlanacak bir sunucuyu nasıl bulduğu, programınızın gereksinimlerine bağlıdır.

Sunucu konak sistemlerini bulmanın iki yöntemi vardır:

  • İstemci kaynak kodu, ortam değişkenleri veya uygulamaya özgü yapılandırma dosyalarındaki dizelerde depolanan bilgileri kullanma. İstemci uygulamanız, istemci ile sunucu arasında bir bağlama oluşturmak için dizedeki verileri kullanabilir.
  • Sunucu programının konumu için ad hizmeti veritabanını sorgulama.

Bu bölüm, aşağıdaki konularda bu tekniklerin her ikisi hakkında bilgi sunar:

Dize Bağlamalarını Kullanma

Uygulamalar dizelerde depolanan bilgilerden bağlamalar oluşturabilir. İstemci uygulamanız bu bilgileri bir dize olarak oluşturur ve ardından RpcBindingFromStringBinding işlevini çağırır. İstemcinin sunucuyu tanımlamak için aşağıdaki bilgileri sağlaması gerekir:

(UUID nesnesi ve uç nokta bilgileri isteğe bağlıdır.)

Aşağıdaki örneklerde pszNetworkAddress parametresi ve diğer parametreler katıştırılmış ters eğik çizgi içerirler. Ters eğik çizgi, C programlama dilindeki bir kaçış karakteridir. Tek bir literâl ters eğik çizgi karakterini temsil etmek için iki ters eğik çizgi gereklidir. Dize bağlama yapısı, sunucu adından önceki iki doğrudan ters eğik çizgi karakterini temsil etmek için dört ters eğik çizgi karakteri içermelidir.

Aşağıdaki örnekte, sprintf_s işlevi dizeyi işledikten sonra dize bağlama veri yapısında dört gerçek ters eğik çizgi karakterinin görünmesi için, sunucu adının önünde sekiz ters eğik çizgi olması gerektiği gösterilmektedir.

/* client application */

char * pszUuid = "6B29FC40-CA47-1067-B31D-00DD010662DA";
char * pszProtocol = "ncacn_np";
char * pszNetworkAddress = "\\\\\\\\servername";
char * pszEndpoint = "\\\\pipe\\\\pipename";
char * pszString;
 
int len = 0;
 
len  = sprintf_s(pszString, strlen(pszUuid), "%s", pszUuid);
len += sprintf_s(pszString + len, strlen(pszProtocolSequence) + 2, "@%s:",
    pszProtocolSequence);
if (pszNetworkAddress != NULL)
    len += sprintf_s(pszString + len, strlen(pszNetworkAddress), "%s",
    pszNetworkAddress);
len += sprintf_s(pszString + len, strlen(pszEndpoint) + 2, "[%s]", pszEndpoint);

Aşağıdaki örnekte dize bağlaması şöyle görünür:

6B29FC40-CA47-1067-B31D-00DD010662DA@ncacn_np:\\\\sunucu adı[\\pipe\\kanal adı]

İstemci daha sonra bağlama tanıtıcısını almak için RpcBindingFromStringBinding çağırır:

RPC_BINDING_HANDLE hBinding;
 
status = RpcBindingFromStringBinding(pszString, &hBinding);
//...

RpcStringBindingCompose, bir yardımcı işlev olarak, nesne UUID, protokol dizisi, ağ adresi ve uç noktayı RpcBindingFromStringBindingçağrısı için doğru sözdiziminde bir araya getirir. Ampersand, iki nokta üst üste ve her protokol dizisi için çeşitli bileşenleri doğru yere koyma konusunda endişelenmenize gerek yoktur; yalnızca dizeleri işleve parametre olarak sağlarsınız. Çalışma zamanı kitaplığı, string bağlaması için gereken belleği bile ayırır.

char * pszNetworkAddress = "\\\\server";
char * pszEndpoint = "\\pipe\\pipename";
status = RpcStringBindingCompose(
            pszUuid,
            pszProtocolSequence,
            pszNetworkAddress,
            pszEndpoint,
            pszOptions,
            &pszString);
//...
status = RpcBindingFromStringBinding(
            pszString,
            &hBinding);
//...

Başka bir kolaylık işlevi olan RpcBindingToStringBinding, giriş olarak bir bağlama tutamacını alır ve karşılık gelen dize bağlamasını üretir.

Ad Hizmeti Veritabanlarından İçeri Aktarma

Ad hizmeti veritabanları, bağlama tanıtıcıları ve UUID'ler gibi öğeleri depolar. İstemci uygulamanız sunucuya bağlanması gerektiğinde bunlardan birini veya ikisini de arayabilir. Bir ad hizmetinin sakladığı bilgilerin ve verilerin depolama biçimiyle ilgili bir tartışma için bkz. RPC Ad Hizmeti Veritabanı.

RPC kitaplığı, istemci programınızın ad hizmeti veritabanında arama yapmak için kullanabileceği iki işlev kümesi sağlar. Bir kümenin adları RpcNsBindingImport ile başlar. Diğer kümenin adları RpcNsBindingLookup ile başlar. İki işlev grubu arasındaki fark, RpcNsBindingImport işlevlerinin çağrı başına tek bir bağlama tanıtıcısı döndürmesi ve RpcNsBindingLookup işlevlerinin çağrı başına tanıtıcı grupları döndürmesidir.

RpcNsBindingImport işlevleriyle bir arama başlatmak için, ilk olarak aşağıdaki kod parçasında gösterildiği gibi RpcNsBindingImportBeginçağrısı yapın.

RPC_STATUS status;
RPC_NS_HANDLE hNameServiceHandle;
 
status = RpcNsBindingImportBegin(
    RPC_C_NS_SYNTAX_DEFAULT,
    NULL,
    MyInterface_v1_0_c_ifspec,
    NULL,
    &hNameServiceHandle);

RPC işlevleri ad hizmeti veritabanında arama yaparken aramayı başlatmak için bir yere ihtiyaç duyar. RPC terminolojisinde bu, giriş adı olarak adlandırılır. İstemci programınız girdi adını ikinci parametre olarak RpcNsBindingImportBegin'e geçirir. Ad hizmeti veritabanının tamamında arama yapmak istiyorsanız bu parametre NULL olabilir. Alternatif olarak, sunucu girdisi adını geçirerek sunucu girdisinde arama yapabilir veya grup girdisi adını geçirerek grup girdisinde arama yapabilirsiniz. Bir giriş adı geçirilmesi, aramayı bu girdinin içeriğiyle kısıtlar.

Önceki örnekte, RPC_C_NS_SYNTAX_DEFAULT değeri RpcNsBindingImportBeginiçin ilk parametre olarak geçilir. Bu, varsayılan giriş adı söz dizimini seçer. Şu anda desteklenen tek giriş-adı söz dizimi budur.

İstemci uygulamanız ad hizmeti veritabanında arabirim adı, UUID veya her ikisini birden arayabilir. Ada göre bir arabirim araması yapmak istiyorsanız, MIDL derleyicisinin IDL dosyanızdan oluşturduğu genel arabirim değişkenini rpcnsBindingImportBeginüçüncü parametre olarak geçirin. Bildirimini, MIDL derleyicisinin istemci saplamasını oluştururken oluşturduğu üst bilgi dosyasında bulabilirsiniz. İstemci programınızın yalnızca UUID'ye göre aramasını istiyorsanız, üçüncü parametreyi null olarak ayarlayın.

Ad hizmeti veritabanında UUID ararken rpcnsBindingImportBegindördüncü parametresini aramak istediğiniz UUID olarak ayarlayın. UUID'yi aramıyorsanız, bu parametreyi null olarak ayarlayın.

RpcNsBindingImportBegin işlevi, isim hizmeti-arama bağlam tutamacının adresini beşinci parametresinden geçirir. Bu parametreyi diğer RpcNsBindingImport işlevlerine geçirirsiniz.

Özellikle, istemci uygulamanızın çağıracağı sonraki işlev RpcNsBindingImportNextolacaktır. İstemci programları, ad hizmeti veritabanından uyumlu bağlama tanıtıcılarını almak için bu işlevi kullanır. Aşağıdaki kod parçası, bu işlevin nasıl çağrılabileceğini gösterir:

RPC_STATUS status;
RPC_BINDING_HANDLE hBindingHandle;
// The variable hNameServiceHandle is a valid name service search 
// context handle obtained from the RpcNsBindingBegin function.
 
status = RpcNsBindingImportNext(hNameServiceHandle, &hBindingHandle);

Bağlama tutamacını almak için RpcNsBindingImportNext işlevini çağırdıktan sonra, istemci uygulamanız aldığı tanıtıcının kabul edilebilir olup olmadığını belirleyebilir. Aksi takdirde, istemci programınız bir döngü yürütebilir ve ad hizmetinin daha uygun bir tanıtıcı içerip içermediğini görmek için RpcNsBindingImportNext yeniden çağırabilir. RpcNsBindingImportNexther bir çağrı için, RpcNsBindingFree'ye karşılık gelen bir çağrı olmalıdır. Aramanız tamamlandığında, arama bağlamını serbest bırakabilmek için RpcNsBindingImportDone işlevini çağırın.

İstemci uygulamanızın kabul edilebilir bir bağlama tutamacı olduktan sonra sunucu uygulamasının çalıştığından emin olunması gerekir. İstemcinizin bu doğrulamayı gerçekleştirmek için kullanabileceği iki yöntem vardır. İlki, istemci arabiriminde bir işlevi çağırmaktır. Sunucu programı çalışıyorsa, çağrı tamamlanır. Aksi takdirde çağrı başarısız olur. Sunucunun çalıştığını doğrulamanın daha iyi bir yolu RpcEpResolveBindingçağırmak ve ardından RpcMgmtIsServerListeningçağrısı yapmaktır. Ad hizmeti veritabanı hakkında daha fazla bilgi için bkz. RPC Ad Hizmeti Veritabanı.