wada06
2025年6月23日 21時49分
==========
製品型番:A6400-D00Z
Debian/ABOSバージョン:3.21.3-at.7
カーネルバージョン:5.10.236-1-at
3G/LTE モジュール情報 (Debianのみ):
その他:
==========
いつもお世話になっております。
Armadillo-640(192.168.xx.4)でマルチキャストの送受信を行うプログラムを作成しておりますが、
イーサーネットを直結したPC(192.168.xx.1)からマルチキャストアドレス(239.0.21.1)に送信しても、
Armadillo-640側で受信できずにいます。
ポートは共通にしており、WiresharkでPCからマルチキャストアドレスにUDP送信されていることは確認しております。
https://armadillo.atmark-techno.com/forum/armadillo/4361
を参考にしましたが、解決できていません。
# cat /sys/class/net/eth0/statistics/multicast
の結果は0で、# cat /sys/class/net/eth0/statistics/rx_packetsの結果はPCから送ったパケット分インクリメントされているみたいです。
周期タスク内の
recv_status = recvfrom(sock_df, &recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&recvaddr, &recvaddr_size);
の結果は負で、errno = EWOULDBLOCKとなります。
下記のUDPの初期設定を行い、初期化には成功します。
/* UDP初期設定 */
int UDP_Init(int *sock_df)
{
int sts = 0;
struct ip_mreq mreq;
/* ソケット関連設定 */
*sock_df = socket(AF_INET, SOCK_DGRAM, 0); // 送受信用ソケット作成
// TTL設定(ルーターを越えないようにする)
int ttl = 3;
if (setsockopt(*sock_df, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) {
perror("setsockopt failed");
close(*sock_df);
}
// ソケット作成失敗
if(*sock_df < 0)
{
perror("Couldn't make a socket");
sts = -1;
}
else
{
printf("make socket success\n");
fflush(stdout);
}
//アドレス再利用を許可
int reuse = 1;
if(setsockopt(*sock_df, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse)) < 0)
{
perror("setsockopt SO_REUSEADDR");
}
// ノンブロッキング設定
int nonblockflag;
nonblockflag = 1;
ioctl(*sock_df , FIONBIO , &nonblockflag);
// ソケットの通信設定
sendaddr.sin_family = AF_INET;
sendaddr.sin_port = htons(PortNumber);
sendaddr.sin_addr.s_addr = INADDR_ANY;
// バインド設定(受信側に合わせる)
int bind_status;
bind_status = bind(*sock_df , (struct sockaddr *)&recvaddr, sizeof(recvaddr));
if(bind_status < 0) {
printf("bind error\n");
fflush(stdout);
}
//マルチキャストグループに参加
mreq.imr_multiaddr.s_addr = inet_addr(IPaddress_s);
mreq.imr_interface.s_addr = INADDR_ANY;
if(setsockopt(*sock_df, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) < 0)
{
perror("setsockopt IP_ADD_MEMBERSHIP");
}
if(setsockopt(*sock_df, IPPROTO_IP, IP_MULTICAST_IF, (char *)&mreq.imr_interface.s_addr, sizeof(mreq.imr_interface.s_addr)) < 0)
{
perror("setsockopt IP_MULTICAST_IF");
}
return sts;
}
ユニキャストでは通信できることを確認しています。
他に何か確認すべき点などありますでしょうか。
お忙しいところ恐縮ですが、何卒よろしくお願いいたします。
at_reika.yamazaki
2025年6月24日 12時57分
お世話になっております。山崎です。
2点、確認です。
1点目、Armadillo でマルチキャスト受信用のプログラムを実行しているとのことですが、こちら ABOS 上でしょうか?それともコンテナ内で実行しているのでしょうか?
2点目、コンテナで実行している場合はコンテナ設定ファイルに
add_ports [ホストポート]:[コンテナポート]/udp
の設定があると思うのですが、こちらは設定しているでしょうか。以上、どうぞよろしくお願いいたします。