blob: 9bfc51a608f2e507025ef38f90a0905ba37a26c1 [file] [log] [blame]
/* event.c
C-style client
Events are based on asynchronous one-way SOAP messaging using HTTP
keep-alive for persistent connections
The 'synchronous' global flag illustrates SOAP one-way messaging,
which requires an HTTP OK response with an empty body to be returned
by the server.
Copyright (C) 2000-2002 Robert A. van Engelen. All Rights Reserved.
Compile:
soapcpp2 -c event.h
cc -o event event.c stdsoap2.c soapC.c soapClient.c
Run (first start the event handler on localhost port 18000):
event
*/
#include "soapH.h"
#include "Event.nsmap"
int synchronous = 0; /* =1: SOAP interoperable synchronous one-way messaging over HTTP */
/* Service details copied from event.h: */
const char *event_handler_endpoint = "http://localhost:18000";
const char *event_handler_action = "event";
int main()
{ struct soap soap;
soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);
if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_A))
soap_print_fault(&soap, stderr);
if (synchronous && soap_recv_empty_response(&soap))
soap_print_fault(&soap, stderr);
if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_B))
soap_print_fault(&soap, stderr);
if (synchronous && soap_recv_empty_response(&soap))
soap_print_fault(&soap, stderr);
/* reset keep-alive when client needs to inform the server that it will close the connection. It may reconnect later */
soap_clr_omode(&soap, SOAP_IO_KEEPALIVE);
if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_C))
soap_print_fault(&soap, stderr);
if (synchronous && soap_recv_empty_response(&soap))
soap_print_fault(&soap, stderr);
/* close the socket */
soap_closesock(&soap);
/* enable keep-alive which is required to accept and execute multiple receives */
soap_set_omode(&soap, SOAP_IO_KEEPALIVE);
if (soap_send_ns__handle(&soap, event_handler_endpoint, event_handler_action, EVENT_Z))
soap_print_fault(&soap, stderr);
else
{ struct ns__handle response;
for (;;)
{ if (!soap_valid_socket(soap.socket))
{ fprintf(stderr, "Connection was terminated (keep alive disabled?)\n");
break;
}
if (soap_recv_ns__handle(&soap, &response))
{ if (soap.error == SOAP_EOF)
fprintf(stderr, "Connection was gracefully closed by server\n");
else
soap_print_fault(&soap, stderr);
break;
}
else
{ switch (response.event)
{ case EVENT_A: fprintf(stderr, "Client Event: A\n"); break;
case EVENT_B: fprintf(stderr, "Client Event: B\n"); break;
case EVENT_C: fprintf(stderr, "Client Event: C\n"); break;
case EVENT_Z: fprintf(stderr, "Client Event: Z\n"); break;
}
}
}
}
soap_closesock(&soap); /* soap_send operations keep the socket open to possibly accept responses, so we need to explicitly close the socket now */
soap_end(&soap); /* this will close the socket too (if keep alive is off), just in case */
soap_done(&soap); /* detach environment (also closes sockets even with keep-alive) */
return 0;
}