Complete ping program

This commit is contained in:
Baptiste Wicht 2016-09-03 22:30:37 +02:00
parent abd56314b8
commit 521f5b7912

View File

@ -14,22 +14,54 @@ namespace {
} // end of anonymous namespace } // end of anonymous namespace
int main(int argc, char* argv[]){ int main(int argc, char* argv[]) {
if(argc != 2){ if (argc != 2) {
tlib::print_line("usage: ping address_ip"); tlib::print_line("usage: ping address_ip");
return 1; return 1;
} }
std::string ip(argv[0]); std::string ip(argv[1]);
auto ip_parts = std::split(ip, '.');
if (ip_parts.size() != 4) {
tlib::print_line("Invalid address IP");
return 1;
}
auto socket = tlib::socket_open(tlib::socket_domain::AF_INET, tlib::socket_type::RAW, tlib::socket_protocol::ICMP); auto socket = tlib::socket_open(tlib::socket_domain::AF_INET, tlib::socket_type::RAW, tlib::socket_protocol::ICMP);
if(!socket){ if (!socket) {
tlib::printf("ls: socket_open error: %s\n", std::error_message(socket.error())); tlib::printf("ls: socket_open error: %s\n", std::error_message(socket.error()));
return 1; return 1;
} }
tlib::icmp::packet_descriptor desc;
desc.payload_size = 0;
desc.target_ip = tlib::ip::make_address(std::atoui(ip_parts[0]), std::atoui(ip_parts[1]), std::atoui(ip_parts[2]), std::atoui(ip_parts[3]));
desc.type = tlib::icmp::type::ECHO_REQUEST;
desc.code = 0;
auto packet = tlib::prepare_packet(*socket, &desc);
if (!packet) {
tlib::printf("ping: prepare_packet error: %s\n", std::error_message(packet.error()));
return 1;
}
auto* command_header = reinterpret_cast<tlib::icmp::echo_request_header*>(packet->payload + packet->index);
command_header->identifier = 0x666;
command_header->sequence = 0x1;
auto status = tlib::finalize_packet(*socket, *packet);
if (!status) {
tlib::printf("ping: finalize_packet error: %s\n", std::error_message(status.error()));
return 1;
}
tlib::socket_close(*socket); tlib::socket_close(*socket);
//TODO Wait for replies
return 0; return 0;
} }