2

OSXで作成したtracerouteプログラムを作成しました。GNU/Linuxに移植しようとしています。

[@osx]
>> sudo bin/traceroute www.google.com

Warning: www.google.com has multiple addresses; using 173.194.69.99
...

GNU / Linuxでコンパイルするために、_GNU_SOURCE機能テストマクロを追加しました。

[@ubuntu]
>> sudo bin/traceroute www.google.com

error setting socket options: Invalid argument

問題は次のとおりです。

 85     send_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 86     if(send_socket == -1){
 87        fprintf(stderr, "\ncannot create send socket");
 88        freeaddrinfo(dest_addrinfo_collection);
 89        return EXIT_FAILURE;
 90      }
 91     error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(int));
 92     if(error != 0){
 93        perror("\nerror setting socket options");
 94        freeaddrinfo(dest_addrinfo_collection);
 95        return EXIT_FAILURE;
 96      }

ソケットオプションとしてsetsockopt(...)認識できないようです。 しかし、私はレベルのソケットオプションとして見ています。IP_TTL
IP_TTLIPPROTO_IP

自分のパケットSOCK_DGRAMを準備しないように、送信ソケットとして使用しています。ICMP

4

2 に答える 2

6

そのため、sizeof(type)の代わりにsizeof(variable)を使用する必要があります。これは、タイプが変更された場合、もう一度失敗するためです。これは、この場合だけでなく、malloc()などを使用する場合にも強くお勧めします。

error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
于 2012-05-20T18:03:28.933 に答える
1

私の間違い、私のttl変数は符号なしのショートでした。

-    error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(int));
+    error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(unsigned short));

アップデート

さらに、option_lenプラットフォームごとに異なる必要がありました。

-    error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(unsigned short));
+#if defined(__APPLE__)
+    error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(&ttl));
+#elif defined(__linux)
+    error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
+#endif

アップデート

-  unsigned short          ttl = 1;
+  socklen_t               ttl = 1;

-#if defined(__APPLE__)
-    error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(&ttl));
-#elif defined(__linux)
     error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
-#endif
于 2012-05-20T17:30:17.097 に答える