arm-linux 程序socket使用SO_BINDTODEVICE指定使用3G网络的问题
我先bind了socket的本地3G网卡的IP地址和我设定的本地端口
socket = bind(...);
然后绑定到网卡,下面是绑定网卡,代码其实我直接是抄arm-linux板载的BSP上busybox的ping里面-I绑定网卡的代码,因为在我板子上使用ping -I ppp0 220.181.111.188 (ppp0是我3G网卡拨号的网卡设备,那个ip是百度的其中一个ip)ping是OK的,而且测试ping的时候我板子有线网断开了,但我使用与busybox ping相同的网卡代码却不能工作,表现是SO_BINDTODEVICE已经成功,但无法使用ppp0发送以及接收数据,我的固定ip服务器无法检测到任何数据,当然那服务器也能使用ping -I ppp0 ping通。
谁busybox比较熟,或者linux多网卡同时工作比较熟的,请教下,除了使用SO_BINDTODEVICE外还需在程序上做什么其他的设置,SO_BINDTODEVICE成功并能正常工作的条件是啥?
struct ifreq interface;
#ifndef IFNAMSIZ
enum { IFNAMSIZ = 16 };
#endif
/* NB: passing (iface, strlen(iface) + 1) does not work!
* (maybe it works on _some_ kernels, but not on 2.6.26)
* Actually, ifr_name is at offset 0, and in practice
* just giving char[IFNAMSIZ] instead of struct ifreq works too.
* But just in case it's not true on some obscure arch... */
strncpy(interface.ifr_ifrn.ifrn_name, strDevName, IFNAMSIZ);
//strncpy(interface.ifr_ifrn.ifrn_name, strDevName, strlen(strDevName)+1);
int err = setsockopt(__sock, SOL_SOCKET, SO_BINDTODEVICE,
&interface, sizeof(interface));
if (err)
{
LOG_OUT("%s SO_BINDTODEVICE failed %d(last error info = %d)",
strDevName, err, GetNetLastErrorCode());
/* Deal with error... */
}
else
{
LOG_OUT("%s SO_BINDTODEVICE OK!",
strDevName);
}
这段代码能运行成功,但实际上网卡没绑上
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论