3

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;
}
4

2 に答える 2

0

ソケットをデバイス固有のブロードキャストアドレス(私の場合は192.168.5.255)にバインドすると、バグが修正されます。なぜこれが起こるのかわかりませんが、機能します。

于 2013-03-28T15:40:52.903 に答える
0

私はあなたの同じ問題を抱えていました、そして私はそれがあなたのネットワークカードインターフェースのドライバーに依存することを保証することができます。実際、外部ネットワークカード(Alphaカードなど)を試してみましたが、この問題はもう発生していません。この提案が、同じ問題に直面する他の人々に役立つことを願っています。

于 2021-05-20T07:02:07.113 に答える