来源:http://bbs.csdn.net/topics/390319063
udp做组播,用抓包软件无法抓到包,说明数据没有发出.然后增加了一句代码(红色标注),数据就可以发出去了,但是去除这句后,过一会儿数据又不能发送出去了.因为这只是个实验,实际的发送是用gsoap的框架来做的,不好修改里面的源代码,求解释. 注:没有启用其他if,wifi关了的,操作系统32位win7.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
WSADATA wsa;
SOCKET udp;
SOCKADDR_IN sinPeer;
struct in_addr eth0;
int flag = 0;
WSAStartup(MAKEWORD(2, 2), &wsa);
udp = socket(AF_INET, SOCK_DGRAM, 0);
<span style= "color: #FF0000;" >eth0.s_addr = htonl(INADDR_ANY);
setsockopt(udp, IPPROTO_IP, IP_MULTICAST_IF, ð0, sizeof (eth0));</span>
memset (&sinPeer, 0, sizeof (sinPeer));
sinPeer.sin_family = AF_INET;
sinPeer.sin_port = htons(3702);
sinPeer.sin_addr.s_addr = inet_addr( "239.255.255.250" );
while (1)
{
sendto(udp, "1234567" , 7, 0, (SOCKADDR *)&sinPeer, sizeof (sinPeer));
Sleep(10);
}
|
|
|
-
关注
-
lostying
-
无言猪
-
本版等级:
-
|
#1 得分:0
回复于: 2012-12-17 14:51:53
红色标注的是
1
2
|
eth0.s_addr = htonl(INADDR_ANY);
setsockopt(udp, IPPROTO_IP, IP_MULTICAST_IF, ð0, sizeof (eth0));
|
这行
|
|
-
关注
-
bustoy
-
bustoy
-
本版等级:
-
|
#3 得分:0
回复于: 2012-12-17 15:29:42
之前写的广播方式的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
m_hSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (m_hSocket == INVALID_SOCKET)
return FALSE;
BOOL bBroadCast = TRUE;
if (setsockopt(m_hSocket, SOL_SOCKET, SO_BROADCAST, ( char *)&bBroadCast, sizeof ( BOOL )) == SOCKET_ERROR)
return FALSE;
BOOL bReuseAddr = TRUE;
if (setsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, ( char *)&bReuseAddr, sizeof ( BOOL )) == SOCKET_ERROR)
return FALSE;
m_saiLocalAddr.sin_family = AF_INET;
m_saiLocalAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
m_saiLocalAddr.sin_port = htons(nLocalPort);
int nRet = bind(m_hSocket, (sockaddr*)&m_saiLocalAddr, sizeof (sockaddr_in));
if (nRet != 0)
return FALSE;
m_saiRemoteAddr.sin_family = AF_INET;
m_saiRemoteAddr.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);
m_saiRemoteAddr.sin_port = htons(nRemotePort);
return TRUE;
|
|
|
-
关注
-
lostying
-
无言猪
-
本版等级:
-
|
#4 得分:0
回复于: 2012-12-17 16:22:01
因为gsoap的框架是没有的,用他的框架发不出去,所以自己才做的最简单的实验.然后用ONVIF的ONVIF Conformance Test Tool来发也不行.但是用我的例子来发送后,ONVIF Conformance Test Tool也发出去几次,然后就不行了.
|
|
-
关注
-
ShengFei01
-
ShengFei01
-
本版等级:
-
|
#5 得分:0
回复于: 2012-12-17 19:25:18
这行只是清0,设置了地址的family, port, addr应该就可以呀,这有个组播程序Sntp,你试试: http://download.csdn.net/detail/geoff08zhang/4571358
|
|
-
关注
-
lostying
-
无言猪
-
本版等级:
-
|
#6 得分:0
回复于: 2012-12-18 11:43:24
嗯,我基本是按里面的设置来的,上面贴的代码是我把多余的部分去除了,实际也做了多播地址的绑定,也没用.
|
|
-
关注
-
lostying
-
无言猪
-
本版等级:
-
|
#7 得分:0
回复于: 2012-12-18 11:48:27
后来发现
1
|
eth0.s_addr = htonl(INADDR_ANY);
|
也不好用,得改成实际地址,比如是
1
|
eth0.s_addr = inet_addr( "192.168.1.5" );
|
|
|
-
关注
-
zzz_zou
-
zzz_zou
-
本版等级:
-
|
#8 得分:0
回复于: 2012-12-21 10:58:11
你这个组播达到目的了吗,你改成了固定的IP,有实现组播的功能吗
|
|
-
关注
-
lostying
-
无言猪
-
本版等级:
-
|
#9 得分:0
回复于: 2012-12-25 11:19:04
固定的IP是用在
1
|
setsockopt(udp, IPPROTO_IP, IP_MULTICAST_IF, ð0, sizeof (eth0))
|
时的,组播是能发出去的,对方如果加入了组,能收到.
|
|
-
关注
-
yurongike3918
-
yurongike3918
-
本版等级:
-
|
#10 得分:0
回复于: 2013-05-07 17:01:27
应该是存在多个网卡导致的。
|
|