4,394
社区成员
发帖
与我相关
我的任务
分享
#include <sys/types.h> // for AF_INET SOCK_RAW
#include <sys/socket.h> // for socket
#include <netinet/in.h> // for sockaddr_in
#include <string.h> // for strerror
#include <errno.h> // for errno
#include <sys/ioctl.h> // for ioctl
#include <net/if.h> // for ifreq
#include <stdio.h>
#include <stdlib.h>
#include <linux/if_ether.h>
#define DIE(x) printf(x);printf("Error Infor = [ %s ] ",strerror(errno)); \
exit(1);
#define BUFF_SIZE 2048
#define PORT_NUMBER 12345
struct ifreq ifr;
int main(int argc,char *argv[])
{
int sock;
sockaddr_in addr_in;
// 网上也有人用 sock = socket(AF_INET,SOCK_PACKET,htonl(EH_P_IP)),我试了下,结果和 这个一样
if (-1 == (sock = socket(AF_INET, SOCK_RAW,htonl(ETH_P_ALL))))
{
DIE("Create socket failed.\n")
}
// 用ifconfig试了下,我的网卡是eth1
strcpy(ifr.ifr_name, "eth1");
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)
{
DIE("ioctl failed.\n");
}
ifr.ifr_flags |= IFF_PROMISC;
printf("Interface is %s.\n",ifr.ifr_name);
if (ioctl(sock, SIOCSIFFLAGS, &ifr) == -1)
{
DIE("Second ioctl failed.\n");
}
printf("Interface %s\n",ifr.ifr_name); // 这里用 $ifconfig eth1 查看网卡 属性,成功设置混杂模式
char buff[BUFF_SIZE];
socklen_t sock_len = sizeof(buff);
printf("Begin capture.\n");
while (true)
{
printf("peek.\n");
memset(buff, 0, sizeof(char) * sock_len);
// 问题就在这里,一直阻塞,没有任何返回值
sock_len = recvfrom(
sock ,buff ,sizeof(buff) ,0 ,(sockaddr *)&addr_in ,&sock_len);
buff[sock_len] = '\0';
printf("%s\n",buff);
}
return 0;
}