相关疑难解决方法(0)

UDP广播发送失败:linux 2.6.30上的"网络无法访问"

我使用udp broadcast.Code段编写程序如下:

struct sockaddr_in broadcast_addr;
socklen_t sock_len=sizeof(broadcast_addr);

bzero(&broadcast_addr,sock_len);
broadcast_addr.sin_family=AF_INET;
broadcast_addr.sin_port=12345;
broadcast_addr.sin_addr.s_addr=inet_addr("255.255.255.255");

int fd=socket(AF_INET,SOCK_DGRAM,0);
int broadcast_enable=1;
setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&broadcast_enable,sizeof(broadcast_enable));

uint8_t send_buf[100];
int ret=sendto(fd,send_buf,sizeof(send_buf),0,
       (struct sockaddr*)&broadcast_addr,sock_len);

 if(ret==-1)
    perror("sendto failed");
Run Code Online (Sandbox Code Playgroud)

输出:

sendto failed: Network is unreachable
Run Code Online (Sandbox Code Playgroud)

但是当我运行"添加默认网关"命令如"route add default gw 1​​0.10.10.111"时,错误消失.当将新的ipaddress设置为netdev时,应该运行上面的命令,否则会出现错误.为什么?谢谢.

sockets linux udp

8
推荐指数
1
解决办法
5002
查看次数

Linux:将UDP侦听套接字绑定到特定接口(或找出数据报来自的接口)?

我有一个守护进程,我正在努力监听UDP广播数据包,并通过UDP进行响应.当一个包进来,我想知道哪个IP地址(或NIC)的包来到TO这样我就可以与该IP地址作为源地址进行响应.(由于涉及很多痛苦的原因,我们系统的一些用户想要将同一台机器上的两个NIC连接到同一个子网.我们告诉他们不要,但是他们坚持.我不需要提醒我有多难看.)

似乎无法检查数据报并直接找出其目标地址或其所在的接口.基于大量的谷歌搜索,我发现找出数据报目标的唯一方法是每个接口有一个监听套接字,并将套接字绑定到各自的接口.

首先,我的监听套接字以这种方式创建:

s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
Run Code Online (Sandbox Code Playgroud)

要绑定套接字,我尝试的第一件事就是这个,其中nicchar*接口名称:

// Bind to a single interface
rc=setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, nic, strlen(nic));
if (rc != 0) { ... }
Run Code Online (Sandbox Code Playgroud)

这根本没有效果,并且无声地失败.ASCII名称(例如eth0)是否传递给此调用的正确名称类型?为什么会无声地失败?根据man 7 socket,"请注意,这仅适用于某些套接字类型,尤其是AF_INET套接字.数据包套接字不支持(在那里使用普通绑定(8))." 我不确定"数据包套接字"是什么意思,但这是一个AF_INET套接字.

所以接下来我尝试的是这个(基于bind vs SO_BINDTODEVICE套接字):

struct sockaddr_ll sock_address;
memset(&sock_address, 0, sizeof(sock_address));
sock_address.sll_family = PF_PACKET;
sock_address.sll_protocol = htons(ETH_P_ALL);
sock_address.sll_ifindex = if_nametoindex(nic);
rc=bind(s, (struct sockaddr*) &sock_address, sizeof(sock_address));
if (rc < 0) { ... }
Run Code Online (Sandbox Code Playgroud)

这也失败了,但这次是错误的Cannot assign requested address.我也尝试将系列更改为AF_INET,但它失败并出现相同的错误.

仍有一个选项,即将套接字绑定到特定的IP地址.我可以查找接口地址并绑定到那些地址.不幸的是,这是一个糟糕的选择,因为由于DHCP和热插拔以太网电缆,地址可以随时更改. …

c sockets linux udp bind

6
推荐指数
1
解决办法
2万
查看次数

标签 统计

linux ×2

sockets ×2

udp ×2

bind ×1

c ×1