+ -
当前位置:首页 → 问答吧 → ubuntu10.04上用g++调试程序出现ioctlread: : Bad file descriptor 急求解决!

ubuntu10.04上用g++调试程序出现ioctlread: : Bad file descriptor 急求解决!

时间:2011-12-10

来源:互联网

liang@ubuntu:~/daima/6$ make
g++ -c main.c
g++ -c rawsocket.c
g++ -c rawsocsniffer.c
g++ -o main main.o rawsocket.o rawsocsniffer.o
liang@ubuntu:~/daima/6$ ./main
socket error: : Operation not permitted
create sniffer succeed.
ioctlread: : Bad file descriptor
sniffer initialize error!

程序编译通过了!但执行主函数时出现如上错误!拜托各位啦!

作者: lianghq0808   发布时间: 2011-12-10

socket error: : Operation not permitted
这里应该是打开Socket出错了。

ioctlread: : Bad file descriptor
可以是上面出错没有退出,继续执行程序,但得到的文件描述符不合法,所以出错。

先保证上一步打开socket成功再继续。

作者: subfate   发布时间: 2011-12-10

调了好久 还是不知道哪里有错啊 帮帮忙看看啊
#include <iostream>
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <netinet/ip.h>  
#include <netinet/tcp.h>  
#include <netinet/udp.h> 
#include <unistd.h>  
#include <net/if.h>  
#include <sys/ioctl.h>  
#include <net/ethernet.h>
#include <string.h>
#include <stdio.h>
#include "rawsocket.h"
rawsocket::rawsocket(const int protocol)
{
  sockfd=socket(PF_PACKET,SOCK_RAW,protocol);
  if(sockfd<0)
  {
perror("socket error: ");
  }
}
rawsocket::~rawsocket()
{
  close(sockfd);
}
bool rawsocket::dopromisc(const char *nif)
{
  struct ifreq ifr;  
  strncpy(ifr.ifr_name, nif,strlen(nif)+1);  
  if((ioctl(sockfd, SIOCGIFFLAGS, &ifr) == -1))  
  {  
  perror("ioctlread: ");  
return false;
  }
  ifr.ifr_flags |= IFF_PROMISC; 
  if(ioctl(sockfd, SIOCSIFFLAGS, &ifr) == -1 )
  { 
  perror("ioctlset: ");
return false;
  }
  return true;
}
int rawsocket::receive(char *recvbuf,int buflen, struct sockaddr_in *from,int *addrlen)
{
  int recvlen;
  recvlen=recvfrom(sockfd,recvbuf,buflen,0,(struct sockaddr *)from,(socklen_t *)addrlen);
  recvbuf[recvlen]='\0';
  return recvlen;
}

作者: lianghq0808   发布时间: 2011-12-10