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!
程序编译通过了!但执行主函数时出现如上错误!拜托各位啦!
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成功再继续。
这里应该是打开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;
}
#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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28