udp组播的奇怪现象

无言猪 2012-12-17 02:50:01
udp做组播,用抓包软件无法抓到包,说明数据没有发出.然后增加了一句代码(红色标注),数据就可以发出去了,但是去除这句后,过一会儿数据又不能发送出去了.因为这只是个实验,实际的发送是用gsoap的框架来做的,不好修改里面的源代码,求解释.
注:没有启用其他if,wifi关了的,操作系统32位win7.

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);

eth0.s_addr = htonl(INADDR_ANY);
setsockopt(udp, IPPROTO_IP, IP_MULTICAST_IF, ð0, sizeof(eth0));


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);
}
...全文
524 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yurongike3918 2013-05-07
  • 打赏
  • 举报
回复
应该是存在多个网卡导致的。
无言猪 2012-12-25
  • 打赏
  • 举报
回复
引用 8 楼 zzz_zou 的回复:
你这个组播达到目的了吗,你改成了固定的IP,有实现组播的功能吗
固定的IP是用在
setsockopt(udp, IPPROTO_IP, IP_MULTICAST_IF,  ð0, sizeof(eth0))
时的,组播是能发出去的,对方如果加入了组,能收到.
zzz_zou 2012-12-21
  • 打赏
  • 举报
回复
你这个组播达到目的了吗,你改成了固定的IP,有实现组播的功能吗
无言猪 2012-12-18
  • 打赏
  • 举报
回复
后来发现

eth0.s_addr = htonl(INADDR_ANY);
也不好用,得改成实际地址,比如是

eth0.s_addr = inet_addr("192.168.1.5");
无言猪 2012-12-18
  • 打赏
  • 举报
回复
引用 5 楼 ShengFei01 的回复:
这行只是清0,设置了地址的family, port, addr应该就可以呀,这有个组播程序Sntp,你试试: http://download.csdn.net/detail/geoff08zhang/4571358
嗯,我基本是按里面的设置来的,上面贴的代码是我把多余的部分去除了,实际也做了多播地址的绑定,也没用.
ShengFei01 2012-12-17
  • 打赏
  • 举报
回复
这行只是清0,设置了地址的family, port, addr应该就可以呀,这有个组播程序Sntp,你试试: http://download.csdn.net/detail/geoff08zhang/4571358
无言猪 2012-12-17
  • 打赏
  • 举报
回复
引用 2 楼 happyparrot 的回复:
你为什么不加这一句呢?
因为gsoap的框架是没有的,用他的框架发不出去,所以自己才做的最简单的实验.然后用ONVIF的ONVIF Conformance Test Tool来发也不行.但是用我的例子来发送后,ONVIF Conformance Test Tool也发出去几次,然后就不行了.
bustoy 2012-12-17
  • 打赏
  • 举报
回复
之前写的广播方式的代码:


// 创建套接字
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;
快乐鹦鹉 2012-12-17
  • 打赏
  • 举报
回复
你为什么不加这一句呢?
无言猪 2012-12-17
  • 打赏
  • 举报
回复
红色标注的是

    eth0.s_addr = htonl(INADDR_ANY);
    setsockopt(udp, IPPROTO_IP, IP_MULTICAST_IF,  ð0, sizeof(eth0));
这行

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧