2017-05-16 16 views
0

私は以前の質問を見てきましたが、これまでのところ私の問題を解決するのに役立っていません。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も含める必要があります。

私はどこかに誤解がありますか、私のコードに何か問題がありますか、アドバイスしてください。

答えて

0
  • INADDR_ANYはターゲットIPアドレスではなく、マルチキャストグループアドレスでもありません。これは送信先アドレスです。
  • グループに参加する必要はありません。
  • sendaddrは、コード内のいくつかの箇所でsendsockにする必要があります。
  • sizeof stringdataは、それに含まれる文字列の長さを返しません。
+0

この 'sendaddr.sin_addr = htonl(INADDR_ANY)'は、 'INADDR_ANY'のどちらを置き換えるべきですか?または 'mreq.imr_interface.s_addr = INADDR_ANY' – Zac

+0

送信アドレスとして使用しているもの。確かにこれは明らかですか? – EJP

+0

@EJPいいえ、そうではありません。それがあれば、疑問はないだろう –

関連する問題