Telnet program examples
The following program example shows a simple TcpClient class that is intended to explain on how to get started with programming of sockets.
The example sets up a socket communication to R&S SMA and opens a simple user interface, very similar to the telnet, which allows input of commands. To enable real automation, further development of the program is required.
#include <string> //defines structs for socket handling #include <netinet/in.h> using namespace std; typedef struct sockaddr_in SockAddrStruct; typedef struct hostent HostInfoStruct; class TcpClient { public: TcpClient(); ~TcpClient(); void connectToServer( string &hostname, int port ); void disconnect( ); void transmit( string &txString ); void receive( string &rxString ); string getCurrentHostName( ) const; int getCurrentPort( ) const; private: string currentHostName; int currentPort; int currentSocketDescr; SockAddrStruct serverAddress; HostInfoStruct * currentHostInfo; bool clientIsConnected; int receiveBufferSize; };
#include <string> //defines structs for socket handling #include <netinet/in.h> using namespace std; typedef struct sockaddr_in SockAddrStruct; typedef struct hostent HostInfoStruct; class TcpClient { public: TcpClient(); ~TcpClient(); void connectToServer( string &hostname, int port ); void disconnect( ); void transmit( string &txString ); void receive( string &rxString ); string getCurrentHostName( ) const; int getCurrentPort( ) const; private: string currentHostName; int currentPort; int currentSocketDescr; SockAddrStruct serverAddress; HostInfoStruct * currentHostInfo; bool clientIsConnected; int receiveBufferSize; }; #include <netdb.h> #include <netinet/in.h> #include <unistd.h> #include "TcpClient.h" TcpClient::TcpClient() : currentHostName( "" ) , currentPort( 0 ) , currentSocketDescr( 0 ) , serverAddress ( ) , currentHostInfo( NULL ) , clientIsConnected( false ) , receiveBufferSize( 1024 ) { } TcpClient::~TcpClient() { currentHostInfo = NULL; } void TcpClient::connectToServer( string &hostname, int port ) { currentHostInfo = gethostbyname( hostname.c_str( ) ); if( currentHostInfo == NULL ) { currentHostName = ""; currentPort = 0; currentHostInfo = NULL; clientIsConnected = false; printf("error connecting host\n" ); } currentHostName = hostname; currentPort = port; currentSocketDescr = socket(AF_INET, SOCK_STREAM, 0); if( currentSocketDescr == 0 ) { currentHostName = ""; currentPort = 0; currentHostInfo = NULL; clientIsConnected = false; printf("can't create socket\n" ); } serverAddress.sin_family = currentHostInfo->h_addrtype; serverAddress.sin_port = htons( currentPort ); memcpy( (char *) &serverAddress.sin_addr.s_addr, currentHostInfo->h_addr_list[0], currentHostInfo->h_length ); if( connect( currentSocketDescr, ( struct sockaddr *) &serverAddress, sizeof( serverAddress ) ) < 0 ) { throw string("can't connect server\n" ); } clientIsConnected = true; } void TcpClient::disconnect( ) { if( clientIsConnected ) { close( currentSocketDescr ); } currentSocketDescr = 0; currentHostName = ""; currentPort = 0; currentHostInfo = NULL; clientIsConnected = false; } void TcpClient::transmit( string &txString ) { if( !clientIsConnected ) { throw string("connection must be established before any data can be sent\n"); } char * transmitBuffer = new char[txString.length() +1]; memcpy( transmitBuffer, txString.c_str(), txString.length() ); transmitBuffer[txString.length()] = '\n'; //newline is needed! if( send( currentSocketDescr, transmitBuffer, txString.length() + 1, 0 ) < 0 ) { throw string("can't transmit data\n"); } delete [] transmitBuffer; } void TcpClient::receive( string &rxString ) { if( !clientIsConnected ) { throw string("connection must be established before any data can be received\n"); } char * receiveBuffer = new char[receiveBufferSize]; memset( receiveBuffer, 0, receiveBufferSize ); bool receiving = true; while( receiving ) { int receivedByteCount = recv( currentSocketDescr, receiveBuffer, receiveBufferSize, 0 ); if( receivedByteCount < 0 ) { throw string("error while receiving data\n"); } rxString += string( receiveBuffer ); receiving = ( receivedByteCount == receiveBufferSize ); } delete [] receiveBuffer; } string TcpClient::getCurrentHostName( ) const { return currentHostName; } int TcpClient::getCurrentPort( ) const { return currentPort; }
#include <iostream> #include "TcpClient.h" void printUsage() { cout<<"usage: EthernetRawCommand <server-ip> [scpi-command]"<<endl; } int main( int argc, char *argv[] ) { int errorCode = 0; //no error bool useSingleCommand = false; string singleCommand = ""; string hostname = ""; int port = 5025; string input = ""; TcpClient client; switch( argc ) { case 3: useSingleCommand = true; singleCommand = argv[2]; case 2: hostname = argv[1]; break; default: printUsage(); return(-1); } try { client.connectToServer( hostname, port ); bool terminate = false; while( !terminate ) { char buffer[1024]; if( useSingleCommand ) { input = singleCommand; //send string } else { cin.getline( buffer, 1024 ); input = buffer; if( input == "end" ) { terminate = true; } } if( !terminate) { client.transmit( input ); //send string int qPos = input.find( "?", 0 ); //receive string only when needed if( qPos > 0 ) { string rcStr = ""; client.receive( rcStr ); cout << rcStr << endl; } } if( useSingleCommand ) { terminate = true; } } }catch( const string errorString ) { cout<<errorString<<endl; } client.disconnect( ); return errorCode; }
Imprint | Statement of Privacy | Terms & Conditions | © 2016 ROHDE & SCHWARZ |