Hi There all

My name is Shahid Qureshi and I am studying my Bsc(Hons) Computing & Networks at the University of Plymouth in the UK.

I am developing an IP sockets program for my final year Bsc (Hons) in Computing & Networks which is going to be used for the university robot project. I have the IP sockets program working and now I am trying to add some additions functions to the program which allows me to measure network performance related tests over a (LAN).

The tests will include sending/echoing bytes a number of bytes to the server and back. The tests will also need to show the time of how long it took to send & receive the message from the client & server respectively, the timing has to be measure milliseconds and to be able to calculate the the elasped time. The project needs to be in for the 28th August and I am not having much luck with it.

I have enclosed some coding below to show what the program currently looks like at the moment, This also includes my attempts of measuring the time when a message is received by the server, and my attempts to show the number of bytes sent. I desperately need help, any small piece of info you may have just might mke the difference. The coding is shown below for the client & server, this might take a little while to read.

Client Coding:


Code:
#include "mySocket.h" 
#include "myLog.h" 
#include "myException.h" 
#include "myHostInfo.h" 
#include <string.h> 
//#include "PerfTimer.h" 
#include <Windows.h> 
#include <Time.h> 
//#include <afxwin.h> 


myLog winLog; 
void readServerConfig(string&); 
void checkFileExistence(const string&); 

int main() 
{ 
// Initialize the winsock library 
myTcpSocket::initialize(); 
// LARGE_INTEGER *lpPerformanceCount = (LARGE_INTEGER) new (sizeof 
(LARGE_INTEGER)); 
LARGE_INTEGER lpPerformanceCount ; 
// u_char cTTL 
// CString str; 




// get client's information (assume neither the name nor the address is given) 
winLog << endl; 
winLog << "Retrieve the localHost [CLIENT] name and address:" << endl; 
myHostInfo clientInfo; 
string clientName = clientInfo.getHostName(); 
string clientIPAddress = clientInfo.getHostIPAddress(); 
std::cout << "Name: " << clientName << endl; 
std::cout << "Address: " << clientIPAddress << endl; 
winLog << " ==> Name: " << clientName << endl; 
winLog << " ==> Address: " << clientIPAddress << endl; 

// get server's IP address and name 
string serverIPAddress = ""; 
readServerConfig(serverIPAddress); 
winLog << endl; 
winLog << "Retrieve the remoteHost [SERVER] name and address:" << endl; 
winLog << " ==> the given address is " << serverIPAddress << endl; 

myHostInfo serverInfo(serverIPAddress,ADDRESS); 
string serverName = serverInfo.getHostName(); 
std::cout << "Name: " << serverName << endl; 
std::cout << "Address: " << serverIPAddress << endl; 
winLog << " ==> Name: " << serverName << endl; 
winLog << " ==> Address: " << serverIPAddress << endl; 

// create the socket for client 
myTcpSocket myClient(PORTNUM); 
std::cout << myClient; 
winLog << "client configuation: " << endl; 
winLog << myClient; 

// connect to the server. 
std::cout << "connecting to the server [" << serverName << "] ... " << endl; 
winLog << "connecting to the server [" << serverName << "] ... " << endl; 
myClient.connectToServer(serverIPAddress,ADDRESS); 

int recvBytes = 0; 

while (1) 
{ 
// send message to server 
char messageToServer[MAX_MSG_LEN+1]= "hello world2"; 
//char senddata(socketId,buf,MAX_MSG_LENGTH,0); 
//memset(messageToServer,0,sizeof(messageToServer)); 
std::cout << "[SEND] "; 
std::cin.getline(messageToServer,MAX_MSG_LEN); 
//memset(messageToServer,0,sizeof(senddata)); 
std::cout << " %s [%s]with %d bytes of data:"; 
std::cout << strlen(messageToServer); 


//########################################### 

char tmpbuf[128], timebuf[26]; 
time_t ltime; 
string mystr; 
mystr="ABC"; 
// time( &ltime ); 
QueryPerformanceCounter( &lpPerformanceCount); 
std::cout<<( "Time in something:=%ldms,TTL=%d", &lpPerformanceCount); 
//Removing getline so we that we don't need to wait for input //std::cin.getline 
// (messageToServer,MAX_MSG_LEN); 




//########################################### 


winLog << "[SEND] " << mystr << endl; 
myClient.sendMessage(mystr); 
if ( !string(messageToServer).compare("Quit") || !string 
(messageToServer).compare("quit") ) 
break; 

// receive message from server 
string messageFromServer = ""; 
recvBytes = myClient.recieveMessage(messageFromServer); 
if ( recvBytes == -99 ) 
break; 

std::cout << "[RECV:" << serverName << "]: " << messageFromServer << endl; 
winLog << "[RECV:" << serverName << "]: " << messageFromServer << endl; 

} 

return 1; 
} 

void readServerConfig(string& serverIPAddr) 
{ 
serverIPAddr = "127.0.0.1"; //DEBUG 15.02.08 
string serverConfigFile = ".\\serverConfig.txt"; 
//checkFileExistence(serverConfigFile); 
//ifstream serverConfig(serverConfigFile.c_str()); 

// read server's IP address 
//getline(serverConfig,serverIPAddr); 

//serverConfig.close(); 
} 

void checkFileExistence(const string& fileName) 
{ 
ifstream file(fileName.c_str()); 
if (!file) 
{ 
std::cout << "Cannot continue:" << fileName << " does NOT exist!" << endl; 
exit(1); 
} 
file.close(); 
} 



Server coding: 

#include "myEvent.h" 
#include "mySocket.h" 
#include "myLog.h" 
#include "myException.h" 
#include "myHostInfo.h" 
#include "mySemaphore.h" 
#include "myThread.h" 
#include "myThreadArgument.h" 
#include <iostream> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/timeb.h> 
#include <time.h> 



myLog winLog; 



DWORD WINAPI clientHandleThread(LPVOID threadInfo) 
{ 
// this structure will contain all the data this callback will work on 
myThreadArgument* clientArgument = (myThreadArgument*)threadInfo; 

// the semamphore to protect the access to the std output 
mySemaphore* coutSemaphore = clientArgument->getCoutSemaphore(); 

// get the client connection: receiving messages from client and 
// sending messages to the client will all be done by using 
// this client connection 
myTcpSocket* clientConnection = clientArgument->getClientConnect(); 
string clientName = clientArgument->getHostName(); 

// the server is communicating with this client here 
while(1) 
{ 
string messageFromClient = ""; 

// receive from the client 

int numBytes = clientConnection->recieveMessage(messageFromClient); 
if ( numBytes == -99 ) 
break; 

// write to the console and the log file, so lock the semaphore 
coutSemaphore->lock(); 

cout << "[RECV fr " << clientName << "]: " << messageFromClient << endl; 
winLog << "[RECV fr " << clientName << "]: " << messageFromClient << endl; 

// if the client wants to discount 
if ( messageFromClient.compare("quit") == 0 || messageFromClient.compare("Quit") == 0 ) 
{ 
coutSemaphore->unlock(); 
break; 
} 
else // send to the client 
{ 
char messageToClient[MAX_MSG_LEN+1]; 
memset(messageToClient,0,sizeof(messageToClient)); 
cout << "[SEND to " << clientName << "]: "; 
//PC cin.getline(messageToClient,MAX_MSG_LEN); 
winLog << "[SEND to " << clientName << "]: " << messageToClient << endl; 
clientConnection->sendMessage(string(messageToClient)); 
coutSemaphore->unlock(); 
} 
} 

// if we reach here, this session with the client is done, 
// so we set the event on this thread to inform the main 
// control that this session is finished 
clientArgument->getExitEvent()->setEvent(); 
return 1; 
} 

DWORD WINAPI serverHandleThread(LPVOID threadInfo) 
{ 
// this structure will contain all the data this callback will work on 
myThreadArgument* serverArgument = (myThreadArgument*)threadInfo; 

// the semamphore to protect the access to the std output 
mySemaphore* coutSemaphore = serverArgument->getCoutSemaphore(); 

// get the server 
myTcpSocket* myServer = serverArgument->getClientConnect(); 
string serverName = serverArgument->getHostName(); 

// bind the server to the socket 
myServer->bindSocket(); 
cout << endl << "server finishes binding process... " << endl; 
winLog << endl << "server finishes binding process... " << endl; 

// server starts to wait for client calls 
myServer->listenToClient(); 
cout << "server is waiting for client calls ... " << endl; 
winLog << "server is waiting for client calls ... " << endl; 

// server starts to listen, and generates a thread to 
// handle each client 

myThreadArgument* clientArgument[MAX_NUM_CLIENTS]; 
myThread* clientHandle[MAX_NUM_CLIENTS]; 
for ( int i = 0; i < MAX_NUM_CLIENTS; i++ ) 
{ 
clientArgument[i] = NULL; 
clientHandle[i] = NULL; 
} 
int currNumOfClients = 0; 

while ( 1 ) 
{ 
// wait to accept a client connection. 
// processing is suspended until the client connects 
myTcpSocket* client; // connection dedicated for client communication 
string clientName; // client name 
client = myServer->acceptClient(clientName); 
clientName = clientName + "-" + char(65+currNumOfClients); 

// lock the std out so we can write to the console 
coutSemaphore->lock(); 
cout << endl << "==> A client from [" << clientName << "] is connected!" << endl << endl; 
winLog << endl << "==> A client from [" << clientName << "] is connected!" << endl << endl; 
coutSemaphore->unlock(); 

// for this client, generate a thread to handle it 
if ( currNumOfClients < MAX_NUM_CLIENTS-1 ) 
{ 
clientArgument[currNumOfClients] = new myThreadArgument 
(client,coutSemaphore,clientName); 
clientHandle[currNumOfClients] = new myThread(clientHandleThread, 
(void*)clientArgument[currNumOfClients]); 
serverArgument->addClientArgument(clientArgument[currNumOfClients]); 
clientHandle[currNumOfClients]->execute(); 
currNumOfClients++; 
} 
} 

return 1; 
} 

int main(void) 

{ 

// build a semaphore so we can synchronize the access to std cout 
// also includes the log file 
mySemaphore coutSemaphore(string(""),1); 

// Initialize the winsock library 
myTcpSocket::initialize(); 

// create the server: local host will be used as the server, let us 
// first use myHostInfo class to show the name and IP address 
// of the local host 
winLog << endl; 
winLog << "Retrieve the local host name and address:" << endl; 

myHostInfo serverInfo; 
string serverName = serverInfo.getHostName(); 
string serverIPAddress = serverInfo.getHostIPAddress(); 
std::cout << "my localhost (server) information:" << endl; 
std::cout << " Name: " << serverName << endl; 
std::cout << " Address: " << serverIPAddress << endl; 
winLog << " ==> Name: " << serverName << endl; 
winLog << " ==> Address: " << serverIPAddress << endl; 

// open socket on the local host(server) and show its configuration 
myTcpSocket myServer(PORTNUM); 
std::cout << myServer; 
winLog << myServer; 

// create a thread to implement server process: listening to the socket, 
// accepting client calls and communicating with clients. This will free the 
// main control (see below) to do other process. 
myThreadArgument* serverArgument = new myThreadArgument 
(&myServer,&coutSemaphore,serverName); 
myThread* serverThread = new myThread(serverHandleThread,(void*) 
serverArgument); 
serverThread->execute(); 

// main control: since the serverThread is handling the server functions, 
// this main control is free to do other things. 
while ( 1 ) //MAIN CONTROL LOOP 
{ 
// do whatever you need to do here, I am using Sleep(x) 
// to make a little delay, pretending to be the other 
// possible processings. 
Sleep(1000); 

} 
return 1; 
}
Thank you

Shahid

Last edited by shabbir; 6Aug2008 at 00:44.. Reason: Code block