{
 public:
     /// Source IPv4 address
-    uint32_t source_address;
+    uint8_t source_address[4];
     /// Destination IPv4 address
-    uint32_t destination_address;
+    uint8_t destination_address[4];
     /// Zero
     uint8_t zero_byte;
     /// Transport layer protocol
 
 
 #include <algorithm>
 
+#include <boost/assert.hpp>
+
 #include "ip/pseudoipv4header.h"
 
 using namespace std;
+using boost::asio::ip::address_v4;
 
 //-----------------------------------------------------------------------------
 // TcpHeader
 }
 
 uint16_t TcpHeader::calculate_tcp_checksum(
-        const uint32_t src_addr,
-        const uint32_t dest_addr,
-        const char* tcp_payload_data,
+        const address_v4::bytes_type &src_addr,
+        const address_v4::bytes_type &dest_addr,
+        const uint8_t* tcp_payload_data,
         const uint16_t tcp_payload_size_in_bytes )
 {
     set_checksum( 0 );
     );
 
     PseudoIpv4Header pseudo_header;
-    pseudo_header.source_address = htonl(src_addr);
-    pseudo_header.destination_address = htonl(dest_addr);
+    BOOST_ASSERT( src_addr.size() == sizeof(pseudo_header.source_address) );
+    BOOST_ASSERT( dest_addr.size() == sizeof(pseudo_header.destination_address) );
+    // Byte ordering (i.e. endianness) is handle by Boost.Asio
+    copy( src_addr.begin(), src_addr.end(), pseudo_header.source_address );
+    copy( dest_addr.begin(), dest_addr.end(), pseudo_header.destination_address );
     pseudo_header.zero_byte = 0;
     pseudo_header.protocol = IPPROTO_TCP;
     pseudo_header.header_length = htons( tcp_segment_size_in_bytes );
 
 #include <istream>
 #include <ostream>
 
+#include <boost/asio.hpp>
+
 #include "host/messagepayload.h"
 
 //-----------------------------------------------------------------------------
     uint16_t get_checksum() const;
 
     uint16_t calculate_tcp_checksum(
-            const uint32_t src_addr,
-            const uint32_t dest_addr,
-            const char* tcp_payload_data,
+            const boost::asio::ip::address_v4::bytes_type &src_addr,
+            const boost::asio::ip::address_v4::bytes_type &dest_addr,
+            const uint8_t *tcp_payload_data,
             const uint16_t tcp_payload_size_in_bytes
     );
 
 
 
 using namespace std;
 using boost::asio::ip::address;
+using boost::asio::ip::address_v4;
 using boost::asio::ip::address_v6;
 using boost::asio::ip::tcp_raw_protocol;
 using I2n::Logger::GlobalLogger;
     tcp_header.set_window_size( window_size_in_octets ); // window size
 
     // Calculate the checksum of the TCP header
-    uint32_t uint_src_address = source_address.to_v4().to_ulong();
-    uint32_t uint_dst_address = destination_address.to_v4().to_ulong();
+    address_v4::bytes_type src_address = source_address.to_v4().to_bytes();
+    address_v4::bytes_type dst_address = destination_address.to_v4().to_bytes();
     uint16_t cksum = tcp_header.calculate_tcp_checksum(
-            uint_src_address, uint_dst_address, NULL, 0
+            src_address, dst_address, NULL, 0
     );
     tcp_header.set_checksum( cksum );