Linux网络抓包的程序 [使用recvfrom之后无限阻塞]

kansas 2009-05-21 06:12:46
操作系统:
ubuntu 2.6.24
g++
网络没有问题

程序原理是 :
1,先创建一个RAW的socket,
2,再把网卡设为混杂模式。
3,使用recvfrom开始抓包。

症状描述:
recvfrom一直阻塞,不返回任何值:

下面是代码:

#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;
}

搞了几天了,搞不定.
谢谢
...全文
214 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kansas 2009-05-22
  • 打赏
  • 举报
回复
谢谢了
kansas 2009-05-22
  • 打赏
  • 举报
回复
高手帮个忙阿

4,394

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧