text: #ifndef PCAPPP_IP_UTILS
  #define PCAPPP_IP_UTILS
  
  #include <stdint.h>
  #ifdef LINUX
  #include <in.h>
  #include <arpa/inet.h>
  #endif
  #ifdef MAC_OS_X
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #endif
  #if defined(WIN32) || defined(WINx64) || defined(PCAPPP_MINGW_ENV)
  #include <winsock2.h>
  #include <ws2tcpip.h>
  #endif
  #ifdef FREEBSD
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #endif
  
  /// @file
  
  #if defined(WIN32) && !defined(_MSC_VER)
  /**
   * Convert a network format address to presentation format.
   * @param[in] af Address family, can be either AF_INET (IPv4) or AF_INET6 (IPv6)
   * @param[in] src Network address structure, can be either in_addr (IPv4) or in6_addr (IPv6)
   * @param[out] dst Network address string representation
   * @param[in] size 'dst' Maximum size
   * @return pointer to presentation format address ('dst'), or NULL (see errno).
   */
  const char* inet_ntop(int af, const void* src, char* dst, size_t size);
  
  /**
   * Convert from presentation format (which usually means ASCII printable)
   * to network format (which is usually some kind of binary format).
   * @param[in] af Address family, can be either AF_INET (IPv4) or AF_INET6 (IPv6)
   * @param[in] src Network address string representation
   * @param[out] dst Network address structure result, can be either in_addr (IPv4) or in6_addr (IPv6)
   * @return
   * 1 if the address was valid for the specified address family;
   * 0 if the address wasn't valid ('dst' is untouched in this case);
   * -1 if some other error occurred ('dst' is untouched in this case, too)
   */
  int inet_pton(int af, const char* src, void* dst);
  #endif
  
  
  /**
   * \namespace pcpp
   * \brief The main namespace for the PcapPlusPlus lib
   */
  namespace pcpp
  {
  
  	/**
  	 * Extract IPv4 address from sockaddr
  	 * @param[in] sa - input sockaddr
  	 * @return Address in in_addr format
  	 */
  	in_addr* sockaddr2in_addr(struct sockaddr *sa);
  
  	/**
  	 * Extract IPv6 address from sockaddr
  	 * @param[in] sa - input sockaddr
  	 * @return Address in in6_addr format
  	 */
  	in6_addr* sockaddr2in6_addr(struct sockaddr *sa);
  
  	/**
  	 * Converts a sockaddr format address to its string representation
  	 * @param[in] sa Address in sockaddr format
  	 * @param[out]  resultString String representation of the address
  	 */
  	void sockaddr2string(struct sockaddr *sa, char* resultString);
  
  	/**
  	 * Convert a in_addr format address to 32bit representation
  	 * @param[in] inAddr Address in in_addr format
  	 * @return Address in 32bit format
  	 */
  	uint32_t in_addr2int(in_addr inAddr);
  
  	/**
  	 * A struct that represent a single buffer
  	 */
  	template<typename T>
  	struct ScalarBuffer
  	{
  		/**
  		 * The pointer to the buffer
  		 */
  		T* buffer;
  
  		/**
  		 * Buffer length
  		 */
  		size_t len;
  	};
  
  	/**
  	 * Computes the checksum for a vector of buffers
  	 * @param[in] vec The vector of buffers
  	 * @param[in] vecSize Number of ScalarBuffers in vector
  	 * @return The checksum result
  	 */
  	uint16_t compute_checksum(ScalarBuffer<uint16_t> vec[], size_t vecSize);
  
  	/**
  	 * Computes Fowler-Noll-Vo (FNV-1) 32bit hash function on an array of byte buffers. The hash is calculated on each
  	 * byte in each byte buffer, as if all byte buffers were one long byte buffer
  	 * @param[in] vec An array of byte buffers (ScalarBuffer of type uint8_t)
  	 * @param[in] vecSize The length of vec
  	 * @return The 32bit hash value
  	 */
  	uint32_t fnv_hash(ScalarBuffer<uint8_t> vec[], size_t vecSize);
  
  	/**
  	 * Computes Fowler-Noll-Vo (FNV-1) 32bit hash function on a byte buffer
  	 * @param[in] buffer The byte buffer
  	 * @param[in] bufSize The size of the byte buffer
  	 * @return The 32bit hash value
  	 */
  	uint32_t fnv_hash(uint8_t* buffer, size_t bufSize);
  
  } // namespace pcpp
  #endif
  