diff -r 000000000000 -r 83f4b4db085c toolsandutils/wintunnel/testcode/server/CTcpServer.cpp --- /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 +#include +#include + + +/*************************************************************************************** + * + * 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; + +} +