当前位置: 首页 > 面试题库 >

如何将原始套接字绑定到特定接口

卜盛
2023-03-14
问题内容

我的应用程序在CentOS 5.5上运行。我正在使用原始套接字发送数据:

sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sd < 0) {
  // Error
}
const int opt_on = 1;
rc = setsockopt(m_SocketDescriptor, IPPROTO_IP, IP_HDRINCL, &opt_on, sizeof(opt_on));
if (rc < 0) {
  close(sd);
  // Error
}
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = my_ip_address;

if (sendto(m_SocketDescriptor, DataBuffer, (size_t)TotalSize, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0)  {
  close(sd);
  // Error
}

如何将此套接字绑定到特定的网络接口(例如eth1)?


问题答案:
const char *opt;
opt = "eth0";
const len = strnlen(opt, IFNAMSIZ);
if (len == IFNAMSIZ) {
    fprintf(stderr, "Too long iface name");
    return 1;
}
setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, opt, len);

第一行:设置变量

第二行:告诉程序绑定到哪个接口

第3-5行:获取接口名称的长度,并检查其大小是否太大。

六行:设置套接字的套接字选项sd,绑定到设备opt

setsockopt原型:

int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);

此外,请确保您包括if.hsocket.hstring.h头文件



 类似资料:
  • 问题内容: 我正在编写代码以在两个Linux盒之间发送原始以太网帧。为了测试这一点,我只想获得一个简单的客户端发送和服务器接收。 我让客户端正确地制作了数据包(我可以使用数据包嗅探器看到它们)。 在服务器端,我像这样初始化套接字: 我用作ethertype的2字节常量在哪里,所以我听不到多余的网络流量。 当我将此套接字绑定到接口时,必须在socket_addr结构中再次将其传递给协议: 如果我像这

  • 问题内容: 我目前正在使用 属性启动Java VM,以便可以通过JConsole连接到Java VM 进行管理和监视。不幸的是,它监听计算机上的所有接口(IP地址)。 在我们的环境中,通常情况下,一台机器上同时运行多个Java VM。尽管可以告诉JMX侦听不同的TCP端口(使用),但是最好让JMX使用标准的JMX端口并仅绑定到特定的IP地址(而不是所有IP地址)。 这将使查找通过JConsole连

  • 问题内容: 这可能是一件非常简单的事情。我是python的新手,所以不要钉死我。 上面的命令给了我: 我唯一的进口是 问题答案: 如果您不理解错误消息,则表示您引用的是当时不可用的名称。您的代码段可能缺少导入语句。 出于可移植性的原因,套接字模块可能不提供SO_BINDTODEVICE。如果您完全确定自己在支持它的Linux上运行,请尝试用它的数字值替换它: 或对于python 3:

  • 问题内容: 当我在代码中指定要连接的IP时,我有一个小型的单边消息发送器,但是,我无法让套接字接受来自任何IP的连接。这是问题所在。 该是本地主机,如果我手动输入IP,例如,它的工作原理,但是,我怎么能离开它向所有人开放?还是我为此使用了错误的连接类型? 问题答案: 如果要绑定到所有可用的IPv4地址,请指定为IP地址。如果您在路由器后面,并且希望您的套接字可以通过Internet访问,而不是仅在

  • 问题内容: 我正在使用一个守护程序,该守护程序侦听UDP广播数据包,并通过UDP进行响应。当一个包进来,我想知道哪个IP地址(或NIC)的包来到 TO 这样我就可以与该IP地址作为源地址进行响应。(出于很多麻烦的原因,我们系统的某些用户希望将同一台计算机上的两个NIC连接到同一子网。我们告诉他们不要,但是他们坚持要这样做。我不需要提醒我这是多么的丑陋。 ) 似乎没有办法检查数据报并直接找出其目的地

  • 我有一个python应用程序,它需要为IPv6连接选择一个特定的本地源地址,但可以为IPv4连接使用“any”0.0.0.0。但应用程序在中使用主机名,以允许从名称查找地址。 那么,如果在调用之前我不知道是IPv4地址还是IPv6地址,那么如何将特定的IPv6源地址和IPv4“any”地址绑定到本地套接字? 一定有更好的办法。我怀疑我必须自己实现地址查找和选择,并将地址而不是名称传递给。这样,在进