C++ CGI Unique & Raw Hit Counter

nanodano 0 Tallied Votes 255 Views Share

This code snippet actually contains a few nifty things. There are two functions, hasVisited() and main(). hasVisited() makes use of a very handy function for CGI programmers: getenv. You can see I use it to retrieve REMOTE_ADDR which is the person's IP address. In main() it gets the count from a file and increments if needed and outputs back to the same file. It then outputs a simple HTML page that the user sees.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

bool hasVisited()
// Figure out wether unique hit or not
// Returns true if ip address has visited
{
  bool visited = false;
  string userIP = getenv("REMOTE_ADDR");
  string nonUnique;

  ifstream input("iplist.cnt");
  while (input) {                   // See if IP is in list
    getline(input, nonUnique);
    if (userIP == nonUnique) {
      visited = true;
      break;
    }
  }
  input.close();
  
  if (visited == false) {               // Add IP to list
    ofstream output("iplist.cnt", ofstream::app);
    output << userIP << endl;
    output.close();
  }

  return (visited);
}


int main() {
  int uniqueHits;   // Default in case no counter file exists
  int rawHits;
  
  ifstream in("counter.cnt");
  if (!in) {
    uniqueHits = 0;
    rawHits = 0;
  }
  else {
    in >> uniqueHits;          // 1st number = unique hits
    in >> rawHits;             // 2nd number = raw hits
    in.close();
  }

  bool visited = hasVisited();  
  rawHits++;
  if (!visited)
    uniqueHits++;

  ofstream out;
  out.open("counter.cnt");  
  out << uniqueHits << ' ' << rawHits; 
  out.close();

  cout << "Content-type: text/html" << endl << endl
       << "<HTML><BODY>" << endl
       << "This is a hit counter written in C++. <hr>" << endl
       << "Your IP address: " << getenv("REMOTE_ADDR") << ".";
  if (visited) 
    cout << "(Not unique)";
  else
    cout << "(Unique)";
  cout << "<hr>" << endl
       << "Unique hits: " << uniqueHits << "<br>Raw hits: " << rawHits << endl;
  cout << "</BODY></HTML>" << endl;
}
sneekula 969 Nearly a Posting Maven

Does not look like C code to me! What does it do here?

manutd 2 Junior Poster

How about you don't double post code snippets?

~s.o.s~ 2,560 Failure as a human Team Colleague Featured Poster

The duplicate code snippet issue has been dealt with.

manutd 2 Junior Poster

void main() Should be int main (void)

~s.o.s~ 2,560 Failure as a human Team Colleague Featured Poster

Has been taken care of, snippet modified to incorporate the change.
Thanks for notifying this, your help in the code snippet section is greatly appreciated.

Hope you find out more such bugs :D

manutd 2 Junior Poster

Welcome, my pleasure :)

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.