udp发送广播消息为什么发送失败?

时间:2022-02-27 20:42:05
udp发送广播消息为什么发送失败?求救


int count = 0, len, sendlen;
struct sockaddr_in local_addr, broadcast_addr;
unsigned char sendbuf[60];
char buf[20];

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1)
{
    printf("socket failed\n\r");
    return;
}

int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));    

broadcast_addr.sin_family = AF_INET;
//broadcast_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
broadcast_addr.sin_addr.s_addr = inet_addr("255.255.255.255");
broadcast_addr.sin_port = htons(7001);

while (1)
{
    len = sizeof(sendbuf);

    strcpy(sendbuf, "aaaaaa");
    sendlen = sendto(sockfd, sendbuf, len, 0,
                                    (struct sockaddr *)&broadcast_addr, sizeof(struct sockaddr)); 
    if(sendlen < 0)
    {
        printf("send broadcast information failed\n\r");
    }

    sleep(1);    
}

9 个解决方案

#1


广播地址是否正确,返回什么错误信息

#2


引用 1 楼 oyljerry 的回复:
广播地址是否正确,返回什么错误信息
用sendto函数发送后,返回的sendlen = -1

#3


广播的时候, 建立的socket时需要bind具体的地址, 如果多个网卡系统不知道你要发哪个
还有检查下 setsockopt 的返回值

#4


引用 3 楼 zzz3265 的回复:
广播的时候, 建立的socket时需要bind具体的地址, 如果多个网卡系统不知道你要发哪个
还有检查下 setsockopt 的返回值
多谢啊,我试试

#5


引用 3 楼 zzz3265 的回复:
广播的时候, 建立的socket时需要bind具体的地址, 如果多个网卡系统不知道你要发哪个
还有检查下 setsockopt 的返回值
我绑定了,setsocket的返回值为0;
绑定代码为
memset(&local_addr, 0, sizeof(struct sockaddr_in));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(7001);

ret = bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));

还是发送失败,如果是把发送地址"255.255.255.255"改成同一网段的具体ip地址,就可以发送成功,都不知道怎么回事了?

#6


自己试了下,如果把广播地址改为同网段的子网广播地址,就可以了,比如本机192.168.1.211,那么广播地址就为192.168.1.255

#7


检测下setsocketopt返回值正确么?

#8


引用 5 楼 scoredhigh 的回复:
Quote: 引用 3 楼 zzz3265 的回复:

广播的时候, 建立的socket时需要bind具体的地址, 如果多个网卡系统不知道你要发哪个
还有检查下 setsockopt 的返回值
我绑定了,setsocket的返回值为0;
绑定代码为
memset(&local_addr, 0, sizeof(struct sockaddr_in));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(7001);

ret = bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));

还是发送失败,如果是把发送地址"255.255.255.255"改成同一网段的具体ip地址,就可以发送成功,都不知道怎么回事了?


如果多网卡请绑定发送网卡ip地址,不要用INADDR_ANY,特别是笔记本有网卡又有无线网卡的时候。

#9


多谢啊,已经自己解决了
试了下,如果把广播地址改为同网段的子网广播地址,就可以了,比如本机192.168.1.211,那么广播地址就为192.168.1.255
255.255.255.255用于主机配置过程中IP数据报的目的地址。任何情况下,路由器都不会转发数据报的,可以用192.168.255.255或192.168.1.255

#1


广播地址是否正确,返回什么错误信息

#2


引用 1 楼 oyljerry 的回复:
广播地址是否正确,返回什么错误信息
用sendto函数发送后,返回的sendlen = -1

#3


广播的时候, 建立的socket时需要bind具体的地址, 如果多个网卡系统不知道你要发哪个
还有检查下 setsockopt 的返回值

#4


引用 3 楼 zzz3265 的回复:
广播的时候, 建立的socket时需要bind具体的地址, 如果多个网卡系统不知道你要发哪个
还有检查下 setsockopt 的返回值
多谢啊,我试试

#5


引用 3 楼 zzz3265 的回复:
广播的时候, 建立的socket时需要bind具体的地址, 如果多个网卡系统不知道你要发哪个
还有检查下 setsockopt 的返回值
我绑定了,setsocket的返回值为0;
绑定代码为
memset(&local_addr, 0, sizeof(struct sockaddr_in));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(7001);

ret = bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));

还是发送失败,如果是把发送地址"255.255.255.255"改成同一网段的具体ip地址,就可以发送成功,都不知道怎么回事了?

#6


自己试了下,如果把广播地址改为同网段的子网广播地址,就可以了,比如本机192.168.1.211,那么广播地址就为192.168.1.255

#7


检测下setsocketopt返回值正确么?

#8


引用 5 楼 scoredhigh 的回复:
Quote: 引用 3 楼 zzz3265 的回复:

广播的时候, 建立的socket时需要bind具体的地址, 如果多个网卡系统不知道你要发哪个
还有检查下 setsockopt 的返回值
我绑定了,setsocket的返回值为0;
绑定代码为
memset(&local_addr, 0, sizeof(struct sockaddr_in));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(7001);

ret = bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));

还是发送失败,如果是把发送地址"255.255.255.255"改成同一网段的具体ip地址,就可以发送成功,都不知道怎么回事了?


如果多网卡请绑定发送网卡ip地址,不要用INADDR_ANY,特别是笔记本有网卡又有无线网卡的时候。

#9


多谢啊,已经自己解决了
试了下,如果把广播地址改为同网段的子网广播地址,就可以了,比如本机192.168.1.211,那么广播地址就为192.168.1.255
255.255.255.255用于主机配置过程中IP数据报的目的地址。任何情况下,路由器都不会转发数据报的,可以用192.168.255.255或192.168.1.255