LCOV - code coverage report
Current view: top level - src/foreign/tcpip - socket.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 100.0 % 1 1
Test Date: 2024-12-21 15:45:41 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         1433 :         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 datawaiting(int sock) const;
     117              : 
     118              :                 std::string host_;
     119              :                 int port_;
     120              :                 int socket_;
     121              :                 int server_socket_;
     122              :                 bool blocking_;
     123              : 
     124              :                 bool verbose_;
     125              : #ifdef WIN32
     126              :                 static bool init_windows_sockets_;
     127              :                 static bool windows_sockets_initialized_;
     128              :                 static int instance_count_;
     129              : #endif
     130              :         };
     131              : 
     132              : }       // namespace tcpip
     133              : 
     134              : #endif // BUILD_TCPIP
        

Generated by: LCOV version 2.0-1