LCOV - code coverage report
Current view: top level - src/foreign/tcpip - socket.h (source / functions) Hit Total Coverage
Test: lcov.info Lines: 1 1 100.0 %
Date: 2024-05-07 15:28:01 Functions: 0 0 -

          Line data    Source code
       1             : /************************************************************************
       2             :  ** This file is part of the network simulator Shawn.                  **
       3             :  ** Copyright (C) 2004-2007 by the SwarmNet (www.swarmnet.de) project  **
       4             :  ** Shawn is free software; you can redistribute it and/or modify it   **
       5             :  ** under the terms of the BSD License. Refer to the shawn-licence.txt **
       6             :  ** file in the root of the Shawn source tree for further details.     **
       7             :  ************************************************************************/
       8             : 
       9             : #pragma once
      10             : #include <config.h>
      11             : 
      12             : #ifdef SHAWN
      13             :      #include <shawn_config.h>
      14             :      #include "_apps_enable_cmake.h"
      15             :      #ifdef ENABLE_TCPIP
      16             :             #define BUILD_TCPIP
      17             :      #endif
      18             : #else
      19             :      #define BUILD_TCPIP
      20             : #endif
      21             : 
      22             : 
      23             : #ifdef BUILD_TCPIP
      24             : 
      25             : // Get Storage
      26             : #ifdef SHAWN
      27             :         #include <apps/tcpip/storage.h>
      28             : #else
      29             :         #include "storage.h"
      30             : #endif
      31             : 
      32             : #ifdef SHAWN
      33             :      namespace shawn
      34             :       { class SimulationController; }
      35             : 
      36             :      // Dummy function is called when Shawn Simulation starts. Does nothing up to now.
      37             :      extern "C" void init_tcpip( shawn::SimulationController& );
      38             : #endif
      39             : 
      40             : #include <string>
      41             : #include <map>
      42             : #include <vector>
      43             : #include <list>
      44             : #include <deque>
      45             : #include <iostream>
      46             : #include <cstddef>
      47             : 
      48             : 
      49             : struct sockaddr_in;
      50             : 
      51             : namespace tcpip
      52             : {
      53             : 
      54             :         class SocketException: public std::runtime_error
      55             :         {
      56             :         public:
      57        1369 :         SocketException(std::string what) : std::runtime_error(what.c_str()) {}
      58             :         };
      59             : 
      60             :         class Socket
      61             :         {
      62             :                 friend class Response;
      63             :         public:
      64             :                 /// Constructor that prepare to connect to host:port
      65             :                 Socket(std::string host, int port);
      66             : 
      67             :                 /// Constructor that prepare for accepting a connection on given port
      68             :                 Socket(int port);
      69             : 
      70             :                 /// Destructor
      71             :                 ~Socket();
      72             : 
      73             :                 /// @brief Returns an free port on the system
      74             :                 /// @note This is done by binding a socket with port=0, getting the assigned port, and closing the socket again
      75             :                 static int getFreeSocketPort();
      76             : 
      77             :                 /// Connects to host_:port_
      78             :                 void connect();
      79             : 
      80             :                 /// Wait for a incoming connection to port_
      81             :         Socket* accept(const bool create = false);
      82             : 
      83             :                 void send( const std::vector<unsigned char> &buffer);
      84             :                 void sendExact( const Storage & );
      85             :                 /// Receive up to \p bufSize available bytes from Socket::socket_
      86             :                 std::vector<unsigned char> receive( int bufSize = 2048 );
      87             :                 /// Receive a complete TraCI message from Socket::socket_
      88             :                 bool receiveExact( Storage &);
      89             :                 void close();
      90             :                 int port();
      91             :                 void set_blocking(bool);
      92             :                 bool is_blocking();
      93             :                 bool has_client_connection() const;
      94             : 
      95             :                 // If verbose, each send and received data is written to stderr
      96             :                 bool verbose() { return verbose_; }
      97             :                 void set_verbose(bool newVerbose) { verbose_ = newVerbose; }
      98             : 
      99             :         protected:
     100             :                 /// Length of the message length part of a TraCI message
     101             :                 static const int lengthLen;
     102             : 
     103             :                 /// Receive \p len bytes from Socket::socket_
     104             :                 void receiveComplete(unsigned char * const buffer, std::size_t len) const;
     105             :                 /// Receive up to \p len available bytes from Socket::socket_
     106             :                 size_t recvAndCheck(unsigned char * const buffer, std::size_t len) const;
     107             :                 /// Print \p label and \p buffer to stderr if Socket::verbose_ is set
     108             :                 void printBufferOnVerbose(const std::vector<unsigned char> buffer, const std::string &label) const;
     109             : 
     110             :         private:
     111             :                 void init();
     112             :                 static void BailOnSocketError(std::string context);
     113             : #ifdef WIN32
     114             :                 static std::string GetWinsockErrorString(int err);
     115             : #endif
     116             :                 bool atoaddr(std::string, struct sockaddr_in& addr);
     117             :                 bool datawaiting(int sock) const;
     118             : 
     119             :                 std::string host_;
     120             :                 int port_;
     121             :                 int socket_;
     122             :                 int server_socket_;
     123             :                 bool blocking_;
     124             : 
     125             :                 bool verbose_;
     126             : #ifdef WIN32
     127             :                 static bool init_windows_sockets_;
     128             :                 static bool windows_sockets_initialized_;
     129             :                 static int instance_count_;
     130             : #endif
     131             :         };
     132             : 
     133             : }       // namespace tcpip
     134             : 
     135             : #endif // BUILD_TCPIP

Generated by: LCOV version 1.14