diff --git a/tools/tools_common.h b/tools/tools_common.h
index 144bd521f394536cb9725f9b42f74f2902b8e614..23b738ad93dd723040800b74e37e8fb031d97541 100644
--- a/tools/tools_common.h
+++ b/tools/tools_common.h
@@ -162,14 +162,14 @@ dht_params
 parseArgs(int argc, char **argv) {
     dht_params params;
     int opt;
-    while ((opt = getopt_long(argc, argv, ":hidv:p:b:", long_options, nullptr)) != -1) {
+    while ((opt = getopt_long(argc, argv, "hidv::p:n:b::", long_options, nullptr)) != -1) {
         switch (opt) {
         case 'p': {
                 int port_arg = atoi(optarg);
                 if (port_arg >= 0 && port_arg < 0x10000)
                     params.port = port_arg;
                 else
-                    std::cout << "Invalid port: " << port_arg << std::endl;
+                    std::cerr << "Invalid port: " << port_arg << std::endl;
             }
             break;
         case 'b':
@@ -180,8 +180,7 @@ parseArgs(int argc, char **argv) {
                     ss << DHT_DEFAULT_PORT;
                     params.bootstrap.second = ss.str();
                 }
-            }
-            else
+            } else
                 params.is_bootstrap_node = true;
             break;
         case 'h':
@@ -198,19 +197,9 @@ parseArgs(int argc, char **argv) {
         case 'd':
             params.daemonize = true;
             break;
-        case ':':
-            switch (optopt) {
-            case 'b':
-                params.is_bootstrap_node = true;
-                break;
-            case 'v':
-                params.log = true;
-                break;
-            default:
-                std::cout << "option requires an argument -- '" << optopt << '\'' << std::endl;
-                break;
-            }
-            break;
+        case '?':
+            std::cerr << "unrecognized option -- '" << static_cast<char>(optopt) << '\'' << std::endl;
+            exit(EXIT_FAILURE);
         default:
             break;
         }