Re: Onwards and upwards
Below I've posted my front tier. It's only sixty some lines long.
It generates a request and uses UDP to send the request to the
middle tier. Then it waits for a reply. If it doesn't get a
reply, it generates another request and waits again.
One thing I've been thinking about is this line:
SendBuffer sendbuf(udp_packet_max);
That does a heap allocation of udp_packet_max bytes.
For the receive buffer I use the stack. I've thought
about changing the line above to be something like this:
::std::array<char, udp_packet_max> ar;
SendBufferStack(ar);
I've coded that, but haven't tested to see what the
performance is like. Anyway, I have some time to
work on these things and would like to get ideas on
how to improve this program or the rest of the code
and documentation on my site.
#include <platforms.hh>
#include <ErrorWords.hh>
#include <getaddrinfo_wrapper.hh>
#include <poll_wrapper.hh>
#include <ReceiveBufferUDP.hh>
#include <SendBuffer.hh>
#include <stdio.h>
#include <stdlib.h> // exit strtol
#include <syslog_wrapper.hh>
#include <udp_stuff.hh>
#include <zz.front_messages_middle.hh>
using namespace ::cmw;
int main (int argc,char** argv)
{
try{
if(argc<3 || argc>5){
printf("Usage: %s account-number config-file-path [node] [port]\n"
,argv[0]);
return EXIT_FAILURE;
}
#ifndef CMW_WINDOWS
::openlog(argv[0],LOG_NDELAY,LOG_USER);
#endif
windows_start();
getaddrinfo_wrapper res(3==argc ?"127.0.0.1":argv[3]
,argc<5 ?55555: ::strtol(argv[4],nullptr,10)
,SOCK_DGRAM);
SendBuffer sendbuf(udp_packet_max);
for(auto rp=res.get();rp!=nullptr;rp=rp->ai_next){
sendbuf.sock_=::socket(rp->ai_family,rp->ai_socktype,0);
if(-1==sendbuf.sock_)continue;
::pollfd fds {sendbuf.sock_,POLLIN,0};
int wait_millisecs=30000;
for(int jj=0;jj<2;++jj){
front_messages_middle::Marshal(sendbuf
,marshalling_integer(::strtol(argv[1],0,10))
,argv[2]);
sendbuf.Flush(rp->ai_addr,rp->ai_addrlen);
if(0==poll_wrapper(&fds,1,wait_millisecs)){
wait_millisecs*=2;
continue;
}
ReceiveBufferUDP<SameFormat> buf(fds.fd);
if(!buf.GiveBool())throw failure("CMWA: ")<<buf.GiveCharStar();
::exit(EXIT_SUCCESS);
}
}
throw failure("No reply received. Is the CMWA running?");
}catch(::std::exception const& ex){
::std::printf("%s: %s\n", argv[0],ex.what());
syslog_wrapper(LOG_ERR,"%s",ex.what());
return EXIT_FAILURE;
}
}
Brian
Ebenezer Enterprises - Thankful for France the country
who gave us the Statue of Liberty.
http://webEbenezer.net