linux:
// clang -o raw raw.c && ./raw
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#define BUFFER_SIZE 65536
int main(int argc, char *argv[])
{
printf("Starting raw socket\n");
int sockfd, n;
char buffer[BUFFER_SIZE];
struct sockaddr_in addr;
struct iphdr *ip_header;
// 创建 socket
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sockfd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置 socket 选项
int on = 1;
if (setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
// 绑定地址
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
// 接收数据
printf("Waiting for packet\n");
while (1) {
n = recv(sockfd, buffer, BUFFER_SIZE, 0);
if (n < 0) {
perror("recv");
exit(EXIT_FAILURE);
}
// 解析 IP 头部
ip_header = (struct iphdr *)buffer;
printf("Received packet from %s\n", inet_ntoa(*(struct in_addr *)&ip_header->saddr));
}
return 0;
}
1
holycrazy 2023-04-21 09:34:03 +08:00
绑定的网卡不对吧
|
2
opengps 2023-04-21 09:42:30 +08:00
ip 用 0.0.0.0 ,接受本地所有网卡的数据
|
4
lysS OP proto 是 IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP 也不行
|
5
Zss77 2023-04-21 10:29:02 +08:00
客户端在本机的话,走的是本地环路吧………x_x
|
7
MozzieW 2023-04-21 10:37:25 +08:00
少了 listen ?看着是 TCP 的,流程应该是
bind(server) client = listen(server) receive(client) bind 的 Socket 是用来 listen 的,listen 获得的 client 才是好客户端传说的 Socket 。 |
8
idealhs 2023-04-21 10:46:19 +08:00
GPT4:
根据您提供的信息,这段关于使用原始套接字的 C 代码无法捕获到任何数据包。问题可能产生在以下几个方面: 1. 原始套接字权限问题:请确保您的程序具有创建原始套接字所需的足够权限。一般来说,在 Linux 系统下,需要以 root 用户身份运行程序,或使用 setuid 技术来提升程序权限。 2. 选择正确的协议和类型:创建原始套接字时,请确保您选择了正确的协议类型(如 IPPROTO_TCP 或 IPPROTO_UDP )及套接字类型(如 SOCK_RAW )。如果选择的协议或类型不正确,可能导致无法捕获到相应的数据包。 3. 数据包过滤条件:请检查您的代码中是否设置了合适的数据包过滤条件。例如,如果您希望捕获特定的 IP 地址或端口的数据包,应确保代码中设置了合适的过滤条件。 4. 网络接口(网卡)问题:请确保您选择正确的网络接口来捕获数据包。例如,在 Linux 系统下,请确保您已打开待捕获数据包的网卡的混杂模式( promiscuous mode )。 5. 代码逻辑问题:请检查您的代码中是否存在未处理的错误返回,或未捕获数据包的逻辑。尝试扩展代码中的错误处理,添加详细的日志输出,从而找出问题所在。 以上几点仅是针对您所提供的信息给出的一些建议,并不一定能完全解释您遇到的问题。我建议您仔细检查代码逻辑,结合调试信息,找出问题所在。如有其他问题,欢迎随时提问。 |
9
feedcode 2023-04-21 10:55:09 +08:00
你这程序从哪里看来的?你要抓包要用 packet socket https://man7.org/linux/man-pages/man7/packet.7.html
|