toolsandutils/wintunnel/testcode/server/CTcpServer.cpp
changeset 0 83f4b4db085c
child 1 d4b442d23379
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolsandutils/wintunnel/testcode/server/CTcpServer.cpp	Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,317 @@
+// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// CTcpServer
+// System Include
+// 
+//
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+/***************************************************************************************
+ *
+ * Local Include
+ *
+ **************************************************************************************/
+#include "CTcpServer.h"
+
+
+/***************************************************************************************
+ *
+ * PUBLIC METHOD: Constructor
+ *
+ **************************************************************************************/
+CTcpServer::CTcpServer()
+{
+	
+}
+
+
+/***************************************************************************************
+ *
+` * PUBLIC METHOD: Destructor
+ *
+ **************************************************************************************/
+CTcpServer::~CTcpServer()
+{
+	disconnect();
+	release();
+}	
+
+
+/***************************************************************************************
+ *
+ * PUBLIC METHOD: StartServer
+ *
+ **************************************************************************************/
+int CTcpServer::StartServer( char* aLocalInterface, char* aLocalPort )
+{	
+	int r;
+	r =initialise();
+ 
+	if(r != ITS_OK)
+		return r;
+
+	r = setArguments( aLocalInterface, aLocalPort );
+	if(r != ITS_OK)
+		return r;
+	
+	r = makeConnection(iLocal_Sock, iRemote_Sock, iRemote_Addr);
+	return r;
+	
+}
+
+
+/***************************************************************************************
+ *
+ * SECTION: CUSTOMISATION METHODS
+ *
+ **************************************************************************************/
+/***************************************************************************************
+ *
+ * PRIVATE METHOD: ProcessBuffer
+ *
+ **************************************************************************************/
+void CTcpServer::ProcessBuffer( char* aBuffer, int aLen )
+{
+	int i;
+	for( i = 0; i < aLen; i++ ) {
+	//	fprintf( stderr, "%c (0x%x)\n", aBuffer[i], aBuffer[i] );
+		fprintf( stderr, "%c", aBuffer[i] );
+	}
+}
+
+/***************************************************************************************
+ *
+ * PRIVATE METHOD: IsBufferComplete
+ *
+ **************************************************************************************/
+bool CTcpServer::IsBufferComplete(char* aBuffer,int aLen)
+{
+	return true;
+}
+
+
+/***************************************************************************************
+ *
+ * SECTION: PRIVATE METHODS
+ *
+ **************************************************************************************/
+//
+//	Method binds the sock to the address. 
+//
+int CTcpServer::connect(SOCKET &aSocket, SOCKADDR_IN &aAddr)
+{
+	int err;
+	
+	//Bind the local address with a socket, so it listens to that port.
+	if (bind(aSocket,(struct sockaddr*)&aAddr, sizeof(SOCKADDR_IN)) != 0)
+	{	
+		//return, error has occured
+		err = WSAGetLastError();
+		printf ("Error binding socket: %d", err);
+		return E_SOCKETBIND;
+	}
+
+	return ITS_OK;
+}
+
+//
+//  Disoconnect
+//
+int CTcpServer::disconnect()
+{
+	shutdown(iLocal_Sock, SD_SEND);
+	shutdown(iLocal_Sock, SD_RECEIVE);
+
+	//do we close remote sock?
+
+	if (closesocket(iLocal_Sock) == SOCKET_ERROR)
+		return E_SOCKETCLOSE;
+
+	return ITS_OK;
+}
+
+//
+// Method to check if we have IP adress or hostname, and return IP address
+//
+SOCKADDR_IN CTcpServer::getSockAddr( const char* aIp, const char* aPort)
+{
+	SOCKADDR_IN sockAddr;
+
+	// check params
+	assert( aIp != NULL );
+
+	// check for null port
+	if( aPort == NULL ) {
+		aPort = "0";
+	}
+
+	// set the socket
+	sockAddr.sin_family = AF_INET;		
+	sockAddr.sin_port = htons( atoi(aPort) );
+	sockAddr.sin_addr.S_un.S_addr = inet_addr( aIp );
+	return sockAddr;
+}
+
+
+//
+// Method to check if the adress is IP format or is a hostname string.
+//
+bool CTcpServer::isIPAdress(const char* aAddr)
+{
+	int c =0;
+
+	char* q=(char *)aAddr;
+	char* tokenPtr = strtok(q,".");
+	
+	while(tokenPtr != NULL)
+	{
+		tokenPtr = strtok(NULL,".");	
+		c++;
+	}
+
+	if (c==4)
+		return true; //We have IP adrress, nothing to do
+	else 
+		return false;
+}
+
+//
+// Makes a connection, listens, and prints any incoming data.
+//
+int CTcpServer::makeConnection(SOCKET &aLocalSocket, SOCKET &aRemoteSocket, SOCKADDR_IN & aRemoteAddr)
+{
+	int remote_addr_len;
+
+	int err = listen( aLocalSocket, 1 );
+	if( err == SOCKET_ERROR ) 
+	{
+		err = WSAGetLastError ();
+		printf ("Error listening to socket: %d", err);
+		return E_LISTENING;
+	}
+
+	//wait for connection 
+	while( 1 ) 
+		{
+			// Wait for the next connection
+			printf( "\nWaiting for connection...\n" ); 
+			remote_addr_len = sizeof(aRemoteAddr);
+			aRemoteSocket = accept( aLocalSocket, (struct sockaddr*)&aRemoteAddr, &remote_addr_len );
+			if( aRemoteSocket == INVALID_SOCKET ) 
+				{
+				err = WSAGetLastError();
+				printf ("Accept failed. Error: %d",err);
+				return E_ACCEPT;
+				}
+
+			// Connection received 
+			printf( "Connection received from %d.%d.%d.%d : %d\n",
+				aRemoteAddr.sin_addr.S_un.S_un_b.s_b1,
+				aRemoteAddr.sin_addr.S_un.S_un_b.s_b2,
+				aRemoteAddr.sin_addr.S_un.S_un_b.s_b3,
+				aRemoteAddr.sin_addr.S_un.S_un_b.s_b4,
+				aRemoteAddr.sin_port );
+
+			// Read until the socket is closed and print out the info received.
+			err = 1;
+			while( err > 0 ) 
+				{
+				err = recv(aRemoteSocket, iPacket, RECVBUFFSIZE, 0 );
+				if (err == SOCKET_ERROR)
+					 return E_RECEIVING;
+				ProcessBuffer(iPacket, err);
+				err = send(aRemoteSocket, iPacket, err, 0 );
+				if (err == SOCKET_ERROR)
+					return E_SENDING;
+				}
+
+			// Close the socket and go again
+			closesocket(aRemoteSocket);
+	}
+	return ITS_OK;
+}
+
+//
+// Returns a a TCP/IP socket
+//
+SOCKET CTcpServer::getSocket()
+{
+	SOCKET sock;
+	int err;
+
+	// create a socket 
+	sock = socket( AF_INET, SOCK_STREAM, 0 ) ;
+	if( sock == INVALID_SOCKET)
+	{
+		//return, error has occured
+		err = WSAGetLastError ();
+		printf ("Allocating socket failed. Error: %d",err);
+		return NULL;
+	}
+	return sock;
+}
+
+//
+// Initialise use of the dll.
+//
+int CTcpServer::initialise()
+{
+	WORD version;
+	WSADATA wsaData;
+
+	// 1. start the windows iSocket server
+	version = MAKEWORD( 2, 2 );
+	if (WSAStartup( version, &wsaData ))
+		return E_SOCKETSTARTUP;		
+
+	return ITS_OK;		
+}
+
+
+//
+// Release.
+//
+int CTcpServer::release()
+{
+	int err =WSACleanup();
+
+	if ( err == SOCKET_ERROR)
+		return E_SOCKETSHUTDOWN;
+
+	return ITS_OK;
+}
+
+//
+// Set the arguments
+//
+int CTcpServer::setArguments(char* li, char* lp)
+{
+	if(!lp)
+	{
+		printf("Error: Missing argument - lp argument required.\n");
+		return E_INCORRECTARG;
+	}
+	
+	iLocal_Sock = getSocket();
+	iLocal_Addr = getSockAddr(li,lp );	
+	connect(iLocal_Sock,iLocal_Addr);	//bind
+
+	return ITS_OK;
+
+}
+