2017-01-15 5 views
0

sendto経由で複数のパケットを異なるIPアドレスに送信するプログラムを作成しようとしましたが、sendtoへの呼び出しが1238回後に発生しました。 "SendTo:無効な引数 "(perrorで印刷)。 編集:1時間後、sendtoへの呼び出しの回数は正確に1231で、毎回のように残ります。画面に何かを印刷するコードを追加した後は、エラーが発生するたびに1238回の呼び出しに戻り、そのコードを削除して1241になり、約1時間後に1231になりました。 IPアドレスを削除するとオフラインの場合)、これらのパケットはエラーなしで正しく送信されますが、約500回のsendto呼び出しのたびに詰まってしまいます。Ubuntuを使用したC/C++のUDPソケットsendto制限

このエラーは、これらのIPアドレスがの場合に発生します。 sendtoが正しく動作するのと同じサーバー(別名)。 また、異なるIPアドレスに複数回ではなく、同じIPに複数回送信すると、エラーは表示されません。

Googleで検索したときに見つけたさまざまな修正を試しました。私はsysctl.confファイルの設定を試してみました、送信バッファ、somaxconn、バックログ、および他のものを提起しました..私は送信バッファを提起したとき、私はまた、アプリケーション自体でバッファを提起しました。 http://pastebin.com/FCn0ALzn

とエラーを与えるコード::私はARPキャッシュからIPアドレスをクリアすることによってこの問題を解決するために管理している

for (size_t i = 0; i < ips.size(); i++) 
    { 
     cout << i << ") Sending message to: " << ips[i] << endl; 
     server.sin_addr.s_addr = inet_addr(ips[i].c_str()); 
     n = sendto(sock, buffer, strlen(buffer), 0, (const struct sockaddr *)&server, length); 
     if (n < 0) 
     { 
      perror("Sendto"); 
      return; 
     } 
    } 
+2

は、問題のコードを入れてください。なぜ[while(!file.eof())が間違っているのか]を読んでください(http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) 。 – molbdnilo

+0

'ips [i] .c_str()'は有効なIPアドレスを返しますが、1238の呼び出しの後に解析できない文字列を 'inet_addr()'に渡していませんか? – nos

+0

私は 'ips [i] .c_str()'の出力と 'server.sin_addr'の出力をinet_ntoaを使って出力しました。両方とも正しいIPを出力しました。 –

答えて

0

ここ

は、私が書かれているサンプルコードです。すべての sendtoから500の召し、プログラムが数ミリ秒間スリープした後、シェルコマンドを使用してARPキャッシュから処理されたIPアドレスを消去します:このような arp -d [ip]

// Clear ARP cache 
void clearIpArp(char* ip) 
{ 
    char arp[100] = {0}; 
    sprintf(arp, "arp -d %s", ip); 
    system(arp); 
} 
関連する問題