From: Guilherme Maciel Ferreira Date: Sun, 24 Jul 2011 00:18:34 +0000 (-0300) Subject: Split methods X-Git-Tag: v1.1^2~42 X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=a97f0133bf233aa65303f0881f7a2303d8c450bb;p=pingcheck Split methods - create_tcp_header() to create the TCP header for ACK ping - print_rst_reply() to print the TCP header for RST reply --- diff --git a/src/tcp/tcppinger.cpp b/src/tcp/tcppinger.cpp index b681660..8f4cd54 100644 --- a/src/tcp/tcppinger.cpp +++ b/src/tcp/tcppinger.cpp @@ -31,9 +31,6 @@ on this file might be covered by the GNU General Public License. #include -#include "ip/ipv4header.h" -#include "tcp/tcpheader.h" - using namespace std; using boost::asio::const_buffers_1; using boost::asio::io_service; @@ -138,14 +135,13 @@ void TcpPinger::start_send() ++SequenceNumber; // Create an TCP header for an ACK request. - TcpHeader tcp_header; - uint16_t port = ( random() % 16383 ) + 49152; // same as random() % 65536; - tcp_header.source_port( port ); // assign an random ephemeral port number - tcp_header.destination_port( 80 ); - tcp_header.sequence_number( ++SequenceNumber ); - tcp_header.header_length( 5 ); // header size in units of 32 bits (5 words of 32 bits = 5 * 4 bytes = 20 bytes) - tcp_header.acknowledgment( true ); - tcp_header.window_size( 32768 ); // window size + uint16_t source_port = static_cast ( ( random() % 16383 ) + 49152 ); // same as random() % 65536; + uint16_t destination_port = 80; + TcpHeader tcp_header = create_tcp_header( + source_port, + destination_port, + ++SequenceNumber + ); // TODO isolate this part, so it can change without break the rest of the code uint32_t src_addr = get_source_address(); @@ -193,6 +189,24 @@ void TcpPinger::start_send() ); } +TcpHeader TcpPinger::create_tcp_header( + const uint16_t source_port, + const uint16_t destination_port, + const uint16_t sequence_number +) const +{ + // Create an TCP header for an ACK request. + TcpHeader tcp_header; + tcp_header.source_port( source_port ); // assign an random ephemeral port number + tcp_header.destination_port( destination_port ); + tcp_header.sequence_number( sequence_number ); + tcp_header.header_length( 5 ); // header size in units of 32 bits (5 words of 32 bits = 5 * 4 bytes = 20 bytes) + tcp_header.acknowledgment( true ); + tcp_header.window_size( 32768 ); // window size + + return tcp_header; +} + void TcpPinger::handle_timeout() { ReceivedReply = false; @@ -218,8 +232,6 @@ void TcpPinger::start_receive() void TcpPinger::handle_receive_tcp_segment( const size_t &bytes_transferred ) { - std::cerr << "handle_receive( " << bytes_transferred << ")" << std::endl; // TODO - // The actual number of bytes received is committed to the buffer so that we // can extract it using a std::istream object. ReplyBuffer.commit( bytes_transferred ); @@ -231,27 +243,20 @@ void TcpPinger::handle_receive_tcp_segment( const size_t &bytes_transferred ) return; } - Ipv4Header ipv4_hdr; - TcpHeader tcp_hdr; - is >> ipv4_hdr >> tcp_hdr; + Ipv4Header ipv4_header; + TcpHeader tcp_header; + is >> ipv4_header >> tcp_header; // filter out only the TCP reset (RST) replies that match the our expected // sequence number. if ( is && - tcp_hdr.reset() && - tcp_hdr.sequence_number() == SequenceNumber && - ipv4_hdr.get_source_address() == DestinationEndpoint.address() ) + tcp_header.reset() && + tcp_header.sequence_number() == SequenceNumber && + ipv4_header.get_source_address() == DestinationEndpoint.address() ) { ReceivedReply = true; - // TODO print_rst_xxx - // Print out some information about the reply packet. - // RST from 74.125.234.17: seq=4279499795 ttl=56 time=1707165.000s - ptime now = microsec_clock::universal_time(); - GlobalLogger.notice() << " RST from " << ipv4_hdr.get_source_address() - << ": tcp_seq=" << tcp_hdr.sequence_number() - << ", ttl=" << ipv4_hdr.get_time_to_live() - << " time=" << (now - TimeSent).total_milliseconds() << " ms" << endl; + print_rst_reply( ipv4_header, tcp_header ); TcpSegmentReceiveTimer.cancel(); } @@ -259,6 +264,25 @@ void TcpPinger::handle_receive_tcp_segment( const size_t &bytes_transferred ) start_receive(); } +/** + * @brief Prints the RST reply. + * + * @param ipv4_header The IPv4 header received. + * @param tcp_header The TCP RST header. + * @return void + */ +void TcpPinger::print_rst_reply( + const Ipv4Header &ipv4_header, + const TcpHeader &tcp_header +) const +{ + ptime now = microsec_clock::universal_time(); + GlobalLogger.info() << "RST from " << ipv4_header.get_source_address() + << ": tcp_seq=" << tcp_header.sequence_number() + << ", ttl=" << ipv4_header.get_time_to_live() + << " time=" << (now - TimeSent).total_milliseconds() << " ms" << endl; +} + void TcpPinger::set_ping_status( TcpPinger::PingStatus ping_status ) { diff --git a/src/tcp/tcppinger.h b/src/tcp/tcppinger.h index 4795f7f..87c3ca3 100644 --- a/src/tcp/tcppinger.h +++ b/src/tcp/tcppinger.h @@ -27,6 +27,8 @@ on this file might be covered by the GNU General Public License. #include #include "host/pinger.h" +#include "ip/ipv4header.h" +#include "tcp/tcpheader.h" //----------------------------------------------------------------------------- // TcpPinger @@ -66,11 +68,21 @@ private: void set_destination_endpoint( const std::string &destination_ip ); void start_send(); + TcpHeader create_tcp_header( + const uint16_t source_port, + const uint16_t destination_port, + const uint16_t sequence_number + ) const; void handle_timeout(); void start_receive(); void handle_receive_tcp_segment( const std::size_t &bytes_transferred ); + void print_rst_reply( + const Ipv4Header &ipv4_header, + const TcpHeader &tcp_header + ) const; + void set_ping_status( TcpPinger::PingStatus ping_status ); bool select_source_network_interface(