#include "tserverproxy.h" #include #include #include #include #include #include #include #include using namespace std; //============================================================================= enum { OK, WSASTARTUP_FAILED, HOST_UNKNOWN, SOCKET_CREATION_FAILED, CONNECTION_FAILED, SEND_FAILED, RECEIVE_FAILED }; //============================================================================= int askServer(string hostName, int portId, string question, string &answer) { struct hostent *he = gethostbyname(hostName.c_str()); if (!he) return HOST_UNKNOWN; int socket_id = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; memset((char *)&addr, 0, sizeof addr); addr.sin_family = he->h_addrtype; addr.sin_port = htons(portId); memcpy((char *)&(addr.sin_addr), he->h_addr, he->h_length); int rcConnect = connect(socket_id, (struct sockaddr *)&(addr), sizeof addr); if (rcConnect == SOCKET_ERROR) return CONNECTION_FAILED; string message = question; int rcSend = send(socket_id, message.c_str(), message.size(), 0); if (rcSend == SOCKET_ERROR) return SEND_FAILED; char retBuffer[1024]; memset(&retBuffer, 0, 1024); int rcRecv = recv(socket_id, retBuffer, sizeof(retBuffer) - 1, 0); if (rcRecv == SOCKET_ERROR) return RECEIVE_FAILED; retBuffer[rcRecv] = '\0'; closesocket(socket_id); answer = retBuffer; return OK; } //============================================================================= TServerProxy::TServerProxy(const string hostName, int portId) : m_hostName(hostName), m_portId(portId) { #ifdef WIN32 WSADATA wsaData; WORD wVersionRequested = MAKEWORD(1, 1); int irc = WSAStartup(wVersionRequested, &wsaData); #endif } //----------------------------------------------------------------------------- TServerProxy::~TServerProxy() { #ifdef WIN32 WSACleanup(); #endif } //----------------------------------------------------------------------------- bool TServerProxy::testConnection() const { struct hostent *he = gethostbyname(m_hostName.c_str()); if (!he) return false; int socket_id = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; memset((char *)&addr, 0, sizeof addr); addr.sin_family = he->h_addrtype; addr.sin_port = htons(m_portId); memcpy((char *)&(addr.sin_addr), he->h_addr, he->h_length); bool ret = (SOCKET_ERROR != connect(socket_id, (struct sockaddr *)&(addr), sizeof addr)); closesocket(socket_id); return ret; } //----------------------------------------------------------------------------- int TServerProxy::exec(int argc, char *argv[], string &reply) { string cmd; assert(argc > 0); if (argc > 0) { cmd = argv[0]; for (int i = 1; i < argc; ++i) { cmd += ","; cmd += argv[i]; } } return askServer(m_hostName, m_portId, cmd, reply); }