arm-linux 程序socket使用SO_BINDTODEVICE指定使用3G网络的问题

发布于 2021-11-24 12:39:22 字数 1770 浏览 870 评论 0

我先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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文