linux udp 发送数据 绑定指定网卡eth0
linux下可以直接拿来使用,用第一个示例就好了。
注意 struct ifreq 头文件如下: struct ifreq header file
#include <sys/ioctl.h>
#include <net/if.h>
这是代码的方法,肯定也有指定路由的办法。有兴趣的话可以了解一下。大致思路就是使用
route add ...
example(TCP, UDP, RAW):
int sock; struct ifreq ifr; sock = socket(AF_INET, SOCK_DGRAM, 0); memset(&ifr, 0x00, sizeof(ifr)); strncpy(ifr.ifr_name, "eth0", IFNAMSIZE); setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&ifr, sizeof(ifr));
example(PACKET):
int sock; struct sockaddr_ll sl; struct ifreq ifr; sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6)); memset(&sl, 0x00, sizeof(sl)); memset(&ifr, 0x00, sizeof(ifr)); sl.sll_family = AF_PACKET; sl.sll_protocol = htons(ETH_P_IPV6); strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name)); ioctl(fd, SIOCGIFINDEX, &ifr); sl.sll_ifindex = ifr.ifr_ifindex; bind(fd, (struct sockaddr *)&sl, sizeof(sl));
example(PACKET):
int sock; struct sockaddr addr; sock = socket(PF_PACKET, SOCK_PACKET, ETH_P_IP); memset(&addr, 0x00, sizeof(addr)); addr.sa_family = PF_PACKET; strncpy(addr.sa_data, "eth0", sizeof(addr.sa_data)); bind(sock, &addr, sizeof(addr));
SO_BINDTODEVICE套接口选项说明:
SO_BINDTODEVICE
Bind this socket to a particular device like “eth0”, as specified in the passed interface name. If the name is an empty string or the option length is zero, the socket device binding is removed. The passed option is a variable-length null-terminated interface name string with the maximum size of IFNAMSIZ. If a socket is bound to an interface, only packets received from that particular interface are processed by the socket. Note that this only works for some socket types, particularly AF_INET sockets. It is not supported for packet sockets (use normal bind(8) there).
Referenced from:https://blog.csdn.net/networkangle/article/details/52549758?tdsourcetag=s_pcqq_aiomsg