[問題] UDP multicast的問題

看板C_and_CPP (C/C++)作者 (homestay)時間16年前 (2010/04/07 15:16), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
遇到的問題: 目前在練習UDP作Multicast,可是遇到了以下的一些問題= = 發送端比較簡單,對multicast的IP發送即可 問題出在接受端:除了設定SOL_REUSEADDR和IP_ADD_MEMBERSHIP外 還要bind(),但我看了很多範例都是bind到addr.sin_addr.s_addr=htonl(INADDR_ANY); 也就是接受所有的封包? 所以要做Multicast接受端都是要bind此位置嗎? 另外bind和setsockopt的順序會影響結果嗎? 希望得到的正確結果:是否都是bind到INADDR_ANY,在bind前後setsockopt有無差別? 程式跑出來的錯誤結果:沒bind INADDR_ANY 或是其他位指都跑不出來 開發平台: g++ C++ Linux 有問題的code: 這是網路上一小段擷取的code,找了幾個都差不多寫法@@ Example: memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */ addr.sin_port=htons(HELLO_PORT); /* bind to receive address */ if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) { perror("bind"); exit(1); } /* use setsockopt() to request that the kernel join a multicast group */ mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP); mreq.imr_interface.s_addr=htonl(INADDR_ANY); if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) { perror("setsockopt"); exit(1); } /* now just enter a read-print loop */ while (1) { addrlen=sizeof(addr); if ((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0, (struct sockaddr *) &addr,&addrlen)) < 0) { perror("recvfrom"); exit(1); } puts(message); } 補充說明:感謝大家XD thanks -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.240.58 ※ 編輯: homestay 來自: 140.113.240.58 (04/07 15:26)
文章代碼(AID): #1Bl34mOE (C_and_CPP)
文章代碼(AID): #1Bl34mOE (C_and_CPP)