Linux2.6.33.9rtを実行しているいくつかの組み込みシステムがあります。彼らはwifi経由でudpブロードキャストを使用して通信します。通信は非常にうまく機能しますが、数分後に一部のクライアントはパケットの送信を停止します。しかし、彼らはまだそれらを受け取ります。
次のサンプルコードを使用して、問題を再現することができました。コードはブロードキャストメッセージをスパムする数分間実行され、その後停止します。プログラムはまだ応答を実行しています。udpメッセージはネットワークに表示されなくなりました。
プログラムがudpの送信を停止した後、プログラムを再開する唯一の方法は、ネットワークを切断して再接続することです。
この種の行動を引き起こす可能性のあるアイデアはありますか?
int main(int argc, char**argv) {
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("255.255.255.255");
addr.sin_port = htons(atoi(argv[1]));
int num = atoi(argv[2]);
int s;
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("unable to open socket");
exit(1);
}
static int broadcast = 1;
if(setsockopt(s,
SOL_SOCKET,
SO_BROADCAST,
&broadcast,
sizeof(broadcast)) < 0)
{
perror("unable to enable broadcast");
}
for (int i = 0; i < num; ++i)
{
char data[1400];
if (sendto(s, data, 1400, 0,(struct sockaddr *) &addr, sizeof(addr)) < 0)
{
perror("send error");
exit(1);
}
}
close(s);
return 0;
}