- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下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/
我试图在以下内容之后找出存储在“缓冲区”中的数据结构: sock=socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_IP)); recvfrom(sock, bu
我知道这个问题已经被讨论过很多次了:我应该使用 libpcap 还是 PF_PACKET(数据链路套接字)来捕获数据包? 根据我的研究,几乎所有地方都建议使用 libpcap 而不是 PF_PACKE
我一直在研究使用 构造的以太网协议(protocol)(不是 IP) 套接字(PF_PACKET,SOCK_RAW,ether_type) 我有一个小问题。我构建了一个数据包,其中将源和目标 mac
当使用协议(protocol)类型为ETH_P_IP 的PF_PACKET 类型的套接字时,man packet文档讨论了多播的套接字选项。套接字选项是 PACKET_ADD_MEMBERSHIP。
我需要使用 RAW 套接字接收传入的 UDP 数据包,该套接字正在使用以下代码片段打开: static int fd; char *iface; iface = "eth0"; if ( (fd =
在 C 中的 linux 上,设置接口(interface) PROMISC 并使用原始套接字后,我可以通过 read() 读取接口(interface)上的传入数据包。 然而,它并没有得到所有的数据
我有以下2个功能 int listen_socket(unsigned int ip, int port, char *inf) { struct ifreq interface; i
我使用以下方法设置了一个原始数据包套接字: sockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) ); 然后我尝试设置套接字选项 IP_HDRIN
在两台 PC 上,我正在打开一个 AF_PACKET/PF_PACKET 套接字,原始协议(protocol)。 sock = socket(AF_PACKET, SOCK_RAW, htons(PR
我知道 PF_PACKET 系列套接字需要 root 权限, 但我不知道在 linux 上是如何配置的。 任何人都知道如何,它是直接硬编码在内核中吗? 最佳答案 过去只是硬编码在内核中。 但是从 2.
我是一名优秀的程序员,十分优秀!