Listing 4: Server socket class member functions

// file ssocket.cpp
#include "stdhead.h"
#include "flsocket.h"
#include "ssocket.h"

bool ssocket::init(int port)
{
   char *localHost;
   int err = FALSE;

   if (port <= 0)
      return(FALSE);

   if (server_init)
      return(FALSE);

   try
      {
      localHost = new char[1024];
      }

   catch(bad_alloc)
      {
      err = TRUE;
      }

   if (err)
      return(FALSE);

   if (gethostname(localHost, 1023))
      {
      delete localHost;
      return(FALSE);
      }

   serverSocket = 
      socket(AF_INET, SOCK_STREAM, DEFAULT_PROTOCOL);

   if (serverSocket == INVALID_SOCKET)
      {
      delete localHost;
      return(FALSE);
      }

   memset(&sockServerAddr, 0,   sizeof(sockServerAddr));
   sockServerAddr.sin_family = AF_INET;
   sockServerAddr.sin_addr.s_addr = INADDR_ANY;
   sockServerAddr.sin_port = htons(port);

   if (bind(serverSocket, (sockaddr *)&sockServerAddr, 
      sizeof(sockServerAddr))
      == SOCKET_ERROR)
      {
      delete localHost;
      return(FALSE);
      }

   if (listen(serverSocket, QUEUE_SIZE) == SOCKET_ERROR)
      {
      delete localHost;
      return(FALSE);
      }

   srvclientSocket = INVALID_SOCKET;
   server_hostname = localHost;
   delete localHost;
   server_init = TRUE;
   return(TRUE);
}

bool ssocket::server_wait(void)
{
   socklen_t len = sizeof(sockClientAddr);

   if (!is_init())
      return(FALSE);

   srvclientSocket = INVALID_SOCKET;
   srvclientSocket = 
      accept(serverSocket, (sockaddr *)&sockClientAddr, &len);

   if (srvclientSocket == INVALID_SOCKET)
      return(FALSE);

   return(TRUE);
}

bool ssocket::close_client(void)
{
   if (srvclientSocket == INVALID_SOCKET)
      return(FALSE);

   close(srvclientSocket);
   srvclientSocket = INVALID_SOCKET;
   return(TRUE);
}

bool ssocket::close_all(void)
{
   if (srvclientSocket != INVALID_SOCKET)
      close(srvclientSocket);

   close(serverSocket);
   return(TRUE);
}

int ssocket::recv_data(string& buf)
{
   char *fbuf;
   int charRecv, done = FALSE;

   fbuf = new char[IPC_SR_BUFSIZE];
   buf = "";

   while(!done)
      {
      charRecv = 
         recv(srvclientSocket, fbuf, (IPC_SR_BUFSIZE - 1), 
            NO_FLAGS);

      if (charRecv == SOCKET_ERROR)
         {
         delete fbuf;
         return(0);
         }

      fbuf[charRecv] = EOS;
      buf += fbuf;

      if (charRecv < (IPC_SR_BUFSIZE - 1))
         done = TRUE;
      }

   delete fbuf;
   return(buf.length());
}

int ssocket::send_data(string& buf)
{
   string fbuf;
   int len, charSent, pos = 0, bytesToGo, done = FALSE;
   int chunk;

   len = buf.length();

   if (!len)
      return(0);

   if (len < IPC_SR_BUFSIZE)
      {
      if ((charSent = 
           send(srvclientSocket, buf.c_str(), 
              len, NO_FLAGS)) == SOCKET_ERROR)
         return(FALSE);

      return(charSent);
      }

   bytesToGo = len;

   while(!done)
      {
      if (bytesToGo > (IPC_SR_BUFSIZE - 1))
         chunk = IPC_SR_BUFSIZE - 1;
        else
           chunk = bytesToGo;

      fbuf = buf.substr(pos, chunk);

      if ((charSent = 
           send(srvclientSocket, fbuf.c_str(), 
              chunk, NO_FLAGS)) == SOCKET_ERROR)
         {
         pos = 0;
         break;
         }

      bytesToGo -= chunk;
      pos += charSent;

      if (bytesToGo <= 0)
         done = TRUE;
      }

   return(pos);
}
— End of Listing —