私は以前の質問を見てきましたが、これまでのところ私の問題を解決するのに役立っていません。UDPマルチキャスト送信
私はシミュレータからデータを受信しようとしていますが、もう一方の受信側に送信する前にいくつかのデコードとエンコードを行います。現在、UDPマルチキャストを使用して
、私の受信機能が正常に動作し、コードの一部は次のとおりです。
int multicast = 1;
SOCKET recvsock;
sockaddr_in recvaddr;
struct ip_mreq mreq;
memset(&recvaddr, 0, sizeof(recvaddr);
memset(&mreq, 0, sizeof(mreq);
recvaddr.sin_family = AF_INET;
recvaddr.sin_addr = htonl(INADDR_ANY);
recvaddr.sin_port = htons(8807);
mreq.imr_interface.s_addr = INADDR_ANY;
mreq.imr_multiaddr.s_addr = inet_addr("239.254.4.27");
setsockopt(recvsock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
setsockopt(recvsock, SOL_SOCKET, SO_REUSEADDR, (char*)&multicast, sizeof(multicast));
bind(recvsock, (SOCKADDR*)&recvaddr, sizeof(recvaddr));
上記ソケットの設定およびソケットオプションは、受信するために動作します。私はSOCKET_ERROR
の長さを減らすためのチェックを削除しました、私は目的を確認するために私の現在のコードでそれを持っています。
udpマルチキャストの概念は、クライアントまたはサーバーがudpマルチキャストグループに参加してデータを送受信するためのものであり、IPはをグループに参加させるため、このmreq.imr_multiaddr.s_addr = inet_addr("239.254.4.27")
を使用しました。
同じポート番号を複数回バインドする必要があるため、SO_REUSEADDR
を使用する必要があります。シミュレータがポートをバインドしていると思います。使用しないとエラー10048
が発生します。私は送信機能のために同じことをしたとき
ただし、以下のコード:
SOCKET sendsock;
sockaddr_in sendaddr;
memset(&rsendaddr, 0, sizeof(sendaddr);
memset(&mreq, 0, sizeof(mreq);
sendaddr.sin_family = AF_INET;
sendaddr.sin_addr = htonl(INADDR_ANY);
sendaddr.sin_port = htons(8807);
mreq.imr_interface.s_addr = INADDR_ANY;
mreq.imr_multiaddr.s_addr = inet_addr("239.254.4.27");
setsockopt(sendaddr, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
setsockopt(sendaddr, IOL_SOCKET, SO_REUSEADDR, (char*)&multicast, sizeof(multicast));
bind(sendaddr, (SOCKADDR*)&sendaddr, sizeof(sendaddr));
バインドが成功を返し、私はこれを行う際に、しかし:
int send_data = sendto (sendsock, stringdata.c_str(), sizeof(stringdata), 0,(struct sockaddr*)&sendaddr, sizeof(sendaddr));
を私はのエラーを持っています10049
であり、WSAEADDRNOTAVAIL
であり、これはCannot assign requested address
を意味する。
EDIT:現在Microsoftループバックアダプタを使用していますが、ループバックアダプタのIPも含める必要があります。
私はどこかに誤解がありますか、私のコードに何か問題がありますか、アドバイスしてください。
この 'sendaddr.sin_addr = htonl(INADDR_ANY)'は、 'INADDR_ANY'のどちらを置き換えるべきですか?または 'mreq.imr_interface.s_addr = INADDR_ANY' – Zac
送信アドレスとして使用しているもの。確かにこれは明らかですか? – EJP
@EJPいいえ、そうではありません。それがあれば、疑問はないだろう –