#include #if defined(WIN_DOWS) #else #include #include #include #endif #include #include // strtol #include #include #include #include #include #include #include #include #include sock_type connectToAmbassador (char const * node, int port) { sock_type sockfd = getSocket(SOCK_STREAM); addrinfo *res; getaddrinfo_wrapper(node, port, &res); if (::connect(sockfd, res->ai_addr, res->ai_addrlen) != 0) { throw failure("Connect failed. Errno is ") << GetError(); } freeaddrinfo(res); return sockfd; } local_messages_front msgShepherd(4096); template void Receiving (T& buf , sock_type sock) { buf.sock_ = sock; while (true) { buf.BulkRead(); if (buf.GotPacket()) break; } bool reqResult; msgShepherd.Receive(buf, reqResult); if (!reqResult) { ::std::string errorMsg; msgShepherd.Receive(buf, errorMsg); errorMsg.insert(0, "CMWA: "); throw failure(errorMsg); } } int main (int argc , char* argv[]) try { int64_t seconds = time(NULL); #ifdef SYSLOG_AVAILABLE openlog(argv[0] , LOG_PID | LOG_NDELAY , LOG_USER ); #endif if (argc < 4 || argc > 5) { printf("Usage: %s account-number config-file-path node [port]\n" , argv[0]); exit(10); } #ifdef WIN_DOWS WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { throw failure("WSAStartup error is ") << iResult; } #endif int port = 55555; if (5 == argc) { port = ::strtol(argv[4], 0, 10); } sock_type sockfd = connectToAmbassador(argv[3], port); #ifdef ENDIAN_BIG uint8_t const byteOrder = most_significant_first; #else uint8_t const byteOrder = least_significant_first; #endif PersistentWrite(sockfd, &byteOrder, 1); SendBuffer sendbuf; sendbuf.sock_ = sockfd; msgShepherd.Marshal(sendbuf , seconds , marshalling_integer(strtol(argv[1], 0, 10)) , argv[2] ); neolib::segmented_array sa(3); msgShepherd.Marshal(sendbuf , sa ); while (!sendbuf.Flush()) ; uint8_t ambassadorFormat; sockRead(sockfd, &ambassadorFormat, 1); if (byteOrder == ambassadorFormat) { ReceiveBufferTCP buf(4096); Receiving(buf, sockfd); } else { #ifdef ENDIAN_BIG ReceiveBufferTCP buf(4096); #else ReceiveBufferTCP buf(4096); #endif Receiving(buf, sockfd); } closeSocket(sockfd); #ifdef MAKEFILES return 0; #else return 1; #endif } catch (::std::exception const& ex) { printf("direct: %s\n", ex.what()); #ifdef SYSLOG_AVAILABLE syslog(LOG_ERR, "main(): %s\n", ex.what()); #endif #ifdef MAKEFILES return -1; #else return 0; #endif }