gpt4 book ai didi

c++ - 如何同时使用 2 个套接字 PF_INET 和 PF_PACKET?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:32 25 4
gpt4 key购买 nike

我有以下2个功能

int listen_socket(unsigned int ip, int port, char *inf)
{
struct ifreq interface;
int fd;
struct sockaddr_in addr;
int n = 1;

DEBUG(LOG_INFO, "Opening listen socket on 0x%08x:%d %s\n", ip, port, inf);
if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
DEBUG(LOG_ERR, "socket call failed: %s", strerror(errno));
return -1;
}

fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;

if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) {
close(fd);
return -1;
}
if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == -1) {
close(fd);
return -1;
}

strncpy(interface.ifr_ifrn.ifrn_name, inf, IFNAMSIZ);
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0) {
close(fd);
return -1;
}

if (bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) {
close(fd);
return -1;
}

return fd;
}


int raw_socket(int ifindex)
{
int fd;
struct sockaddr_ll sock;

DEBUG(LOG_INFO, "Opening raw socket on ifindex %d\n", ifindex);
if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0) {
DEBUG(LOG_ERR, "socket call failed: %s", strerror(errno));
return -1;
}

fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);

sock.sll_family = AF_PACKET;
sock.sll_protocol = htons(ETH_P_IP);
sock.sll_ifindex = ifindex;
if (bind(fd, (struct sockaddr *) &sock, sizeof(sock)) < 0) {
DEBUG(LOG_ERR, "bind call failed: %s", strerror(errno));
close(fd);
return -1;
}

return fd;
}

都是套接字监听函数。

我在我的应用程序中以这种方式使用了这些功能

fd = listen_socket(INADDR_ANY, 67, client_config.interface);
fd2 = raw_socket(client_config.ifindex);

现在,如果我将数据包发送到我的应用程序(目的地 = 接口(interface)的 ip 和端口 = 67)。什么套接字应该接住我的数据包?是 fd2 还是 fd 还是两者兼而有之?

如果我向我的应用程序发送一个数据包(目的地 = broacast:255.255.255.0 和端口 = 67)。什么套接字应该接住我的数据包?是 fd2 还是 fd 还是两者兼而有之?

最佳答案

两个套接字都将收到该数据包。当每个数据包从网络驱动程序到达内核时,它被复制并发送到所有 PF_PACKET(第 2 层)套接字。数据包也被发送到第 3 层 (IP/TCP) 内核代码,并从那里发送到指定的套接字。

如果这没有发生,运行一个单独的程序进行原始数据包捕获(例如 wireshark)将阻止网络上的任何其他通信。

关于c++ - 如何同时使用 2 个套接字 PF_INET 和 PF_PACKET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30788038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com