Click here to Skip to main content
15,896,476 members
Articles / Web Development / HTML

Runtime Trace

Rate me:
Please Sign up or sign in to vote.
3.60/5 (5 votes)
30 Mar 20033 min read 57.6K   1.5K   22  
Display trace messages at runtime from several running applications on different machines
#ifndef BOGDAN_RECHI_DDDOI_RTCLASS_H__
#define BOGDAN_RECHI_DDDOI_RTCLASS_H__

#include <stdio.h>
#include <stdarg.h>
#include <atlbase.h>
#include <Winsock2.h>

class TraceClass
{
  BOOL      m_bConnected;
  SOCKET    m_sock;
  TCHAR     m_szName[50];

public:
  TCHAR     m_szError[50];

  TraceClass()
  {
    WSADATA wsaData;
    
//    m_szError.Empty();
    *m_szError=0;
    
    m_bConnected=FALSE;
    if (WSAStartup(0x0202,&wsaData))
    {
//      m_szError.Format("Cannot startup sockets library!");
      wsprintf(m_szError, _T("Cannot startup sockets library!"));
      return;
    }
  }
    
  BOOL SetTarget(LPCTSTR szIP, LPCTSTR szName, short nPort)
  {
    USES_CONVERSION;

    struct sockaddr_in serv;
    struct sockaddr_in client;
    
//    m_szName.Format("%s", szName);
    wsprintf(m_szName, _T("%s"), szName);

    if (m_bConnected)
    {
      shutdown(m_sock, 2);
      closesocket(m_sock);
    }
    
    if ((m_sock=socket(AF_INET, SOCK_DGRAM, 0))==
      INVALID_SOCKET) 
    {
//      m_szError.Format("Cannot create socket!");
      wsprintf(m_szError, _T("Cannot create socket!"));
      
      return FALSE;
    } 
    
    memset((void *)&serv, 0, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = inet_addr(T2A(const_cast<LPTSTR>(szIP)));
    serv.sin_port = htons(nPort);
    
    memset((void *)&client, 0, sizeof(client));
    client.sin_family = AF_INET;
    
    try
    {
      if (bind(m_sock, (struct sockaddr*)&client, 
        sizeof(client))==SOCKET_ERROR)
        throw (_T("Error on binding the socket!"));
      
      if (!(m_bConnected=SOCKET_ERROR != connect(m_sock, 
        (struct sockaddr*)&serv, sizeof(serv))))
        throw _T("Error on connecting to socket!");
    }
    catch (LPTSTR szMan)
    {
      lstrcpy(m_szError, szMan);
      shutdown(m_sock, 2);
      closesocket(m_sock);
      
      return FALSE;
    }
    
    return TRUE;
  }

  BOOL Trace(LPCTSTR fmt, ...)
  {
    USES_CONVERSION;

    if (!m_bConnected) return FALSE;

    TCHAR *buff=new TCHAR[1024], *szFin;
    char sz[100];
    va_list param;
    SYSTEMTIME st;

    va_start( param, fmt);
//    buff.FormatV(fmt, param);
    for (int i=1; _vsntprintf(buff, i*1024, fmt, 
      param)==-1; i++)
    {
      delete [] buff;
      buff=new TCHAR[(i+1)*1024];
    }
    va_end( param );

    szFin=new TCHAR[110+lstrlen(m_szName)+lstrlen(_T("[22:22:22] "))
      +lstrlen(buff)];

    gethostname(sz, 100);
    GetLocalTime(&st);
    // note begin
    // protocol: machine name"application name" text
    // " is used
    wsprintf(szFin, _T("%s\"%s\" [%d:%d:%02d] %s"), A2T(sz), m_szName,
      st.wHour, st.wMinute, st.wSecond, buff);
    // note end
    delete [] buff;
    
    if (send(m_sock, (char *)szFin, lstrlen(szFin)*sizeof(TCHAR),
      0)==SOCKET_ERROR)
    {
//      m_szError.Format("Error on sending message!");
      wsprintf(m_szError, _T("Error on sending message!"));
      return FALSE;
    }
    delete [] szFin;

    return TRUE;
  }
  
  ~TraceClass()
  {
    shutdown(m_sock, 2);
    closesocket(m_sock);
    
    WSACleanup();	
  }
};


#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.


Written By
Software Developer (Senior)
Europe Europe
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions