SERVER.C

/*************************************************************/ 
/** **/
/** Microsoft RPC Examples **/
/** OSF DCE Interop Application **/
/** Copyright 1993 - 1998 Microsoft Corporation **/
/** **/
/*************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#include "msg.h" /* header file generated by M/IDL compiler */

#if defined(__RPC_WIN32__) || defined(__RPC_DOS__)

/*
On MS platforms we must include the dceport.h header file
which maps OSF DCE style APIs to MS style APIs.

Currently, we must also define a common interface handle name.
*/

#include "dceport.h"

#else
#include <pthread.h>
#endif

#ifndef _CRTAPI1
#define _CRTAPI1
#endif

void Usage()
{
printf("Usage : server -e <endpoint> - optional endpoint\n");
printf(" -t <transport> - optional, default ncacn_ip_tcp\n");
exit(1);
}

int _CRTAPI1
main(int argc, char *argv[])
{
unsigned32 status;
unsigned char * pszProtocolSequence = (unsigned char *)"ncacn_ip_tcp";
unsigned char * pszEndpoint = NULL;
unsigned int cMaxCalls = 20;
rpc_binding_vector_p_t pbvBindings = NULL;
int i;

printf ("Microsoft RPC Demo - OSF DCE Interop Message Server\n");

for (i = 1; i < argc; i++) {
if ((*argv[i] == '-') || (*argv[i] == '/')) {
switch (tolower(*(argv[i]+1))) {
case 'e':
pszEndpoint = (unsigned char *)argv[++i];
break;
case 't':
pszProtocolSequence = (unsigned char *)argv[++i];
break;
case 'h':
case '?':
default:
Usage();
}
}
else
Usage();
}

if (pszEndpoint != NULL)
{
/*
Since we have an explict endpoint, use it and
wait for client requests.
*/
rpc_server_use_protseq_ep(pszProtocolSequence,
cMaxCalls,
pszEndpoint,
&status);
if (status) {
printf("rpc_server_use_protseq_ep returned 0x%x\n", status);
return status;
}
}
else
{
/*
No explict endpoint, use the protocol sequence and register
the endpoint with the endpoint mapper.
*/
rpc_server_use_protseq(pszProtocolSequence,
cMaxCalls,
&status);
if (status) {
printf("rpc_server_use_protseq returned 0x%x\n", status);
return status;
}

rpc_server_inq_bindings(&pbvBindings, &status);
if (status) {
printf("rpc_server_inq_bindings returned 0x%x\n", status);
return status;
}

rpc_ep_register(interop_v1_0_s_ifspec,
pbvBindings,
0,
0,
&status);
if (status) {
printf("rpc_ep_register returned 0x%x\n", status);
return status;
}
}

rpc_server_register_if(interop_v1_0_s_ifspec,
0,
0,
&status);
if (status) {
printf("rpc_server_register_if returned 0x%x\n", status);
return status;
}

printf("RPC server ready\n");
rpc_server_listen(cMaxCalls,&status);

if (status) {
printf("rpc_server_listen returned: 0x%x\n", status);
return status;
}

rpc_server_unregister_if(interop_v1_0_s_ifspec,
0,
&status);
if (status) {
printf("rpc_server_unregister_if returned 0x%x\n", status);
return status;
}

if (pszEndpoint == NULL)
{
/*
Unregister from endpoint mapper
*/
rpc_ep_unregister(interop_v1_0_s_ifspec,
pbvBindings,
0,
&status);
if (status) {
printf("rpc_ep_unregister returned 0x%x\n", status);
return status;
}

rpc_binding_vector_free(&pbvBindings, &status);
if (status) {
printf("rpc_binding_vector_free returned 0x%x\n", status);
return status;
}
}
}