Sunucu Uygulaması
Aşağıdaki örnek, Platform Yazılım Geliştirme Seti'nin (SDK) RPC\Hello dizinindeki 'Hello World' uygulamasındandır. Dağıtılmış uygulamanın sunucu tarafı, hizmetlerinin kullanılabilir olduğunu sisteme bildirir. Ardından istemci isteklerini bekler. MIDL derleyicisi aşağıdaki örnekle kullanılmalıdır.
Uygulamanızın boyutuna ve kodlama tercihlerinize bağlı olarak, bir veya daha fazla ayrı dosyada uzak yordamlar uygulamayı seçebilirsiniz. Bu öğretici programında, Hellos.c kaynak dosyası ana sunucu yordamını içerir. Hellop.c dosyası uzak yordamı içerir.
Uzak yordamları ayrı dosyalarda düzenlemenin avantajı, yordamların dağıtılmış bir uygulamaya dönüştürülmeden önce kodun hatalarını ayıklamak için tek başına bir programla bağlanabilmesidir. Yordamlar tek başına programda çalıştırıldıktan sonra, uzak yordamları içeren kaynak dosyaları derleyebilir ve sunucu uygulamasıyla ilişkilendirebilirsiniz. İstemci-uygulama kaynak dosyasında olduğu gibi, sunucu-uygulama kaynak dosyası Hello.h üst bilgi dosyasını içermelidir.
Sunucu, bağlama bilgilerini istemcinin kullanımına açmak için RpcServerUseProtseqEpve RpcServerRegisterIfRPC çalışma zamanı işlevlerini çağırır. Bu örnek program, arabirim tanıtıcı adını RpcServerRegisterIf'e iletir. Diğer parametreler NULL olarak ayarlanır. Ardından sunucu, istemci isteklerini beklediğini belirtmek için RpcServerListen işlevini çağırır.
Sunucu uygulaması, sunucu saptamasının çağırdığını iki bellek yönetimi işlevini de içermelidir: midl_user_allocate ve midl_user_free. Bir uzak yordam parametreleri sunucuya geçirdiğinde, bu işlevler sunucuda bellek tahsis eder ve serbest bırakır. Bu örnek programda, midl_user_allocate ve midl_user_free, C kütüphanesi işlevleri olan malloc ve freeiçin basitçe sarmalayıcılardır. (MIDL derleyicisi tarafından oluşturulan iletme bildirimlerinde "MIDL"nin büyük harf olduğunu unutmayın. Rpcndr.h üst bilgi dosyası sırasıyla midl_user_free ve midl_user_allocate MIDL_user_free ve MIDL_user_allocate olarak tanımlar.)
/* file: hellos.c */
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "hello.h"
#include <windows.h>
void main()
{
RPC_STATUS status;
unsigned char * pszProtocolSequence = "ncacn_np";
unsigned char * pszSecurity = NULL;
unsigned char * pszEndpoint = "\\pipe\\hello";
unsigned int cMinCalls = 1;
unsigned int fDontWait = FALSE;
status = RpcServerUseProtseqEp(pszProtocolSequence,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
pszEndpoint,
pszSecurity);
if (status) exit(status);
status = RpcServerRegisterIf(hello_ServerIfHandle,
NULL,
NULL);
if (status) exit(status);
status = RpcServerListen(cMinCalls,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
fDontWait);
if (status) exit(status);
}
/******************************************************/
/* MIDL allocate and free */
/******************************************************/
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
return(malloc(len));
}
void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
free(ptr);
}