我使用原始套接字,我遇到了这个问题:
错误的文件描述符
代码是:
#include<stdio.h>
#include<sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd; //file descriptor raw socket
int ioInt;
struct ifreq req; //struttura per la chiamata di ioctl
fd=socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
if(fd==-1) {
if(errno==EPROTONOSUPPORT)
perror("socket o protocollo non supportato dal dominio");
if(errno==EACCES)
perror("mancano i privilegi per creare il socket");
if(errno==EINVAL)
perror("protocollo sconosciuto o dominio non disponibile");
if(errno==ENOBUFS || errno==ENOMEM)
perror("memoria non sufficente per la creazione del socket");
}
strncpy (req.ifr_name, "eth0", sizeof(req.ifr_name) - 1);
ioInt=ioctl(fd, SIOCGIFINDEX, &req);
if(ioInt==-1)
perror("SIOCGIFINDEX");
return 0;
}
我必须访问eth0并希望send e收到一个数据包。我使用linux mint 12
答案 0 :(得分:3)
当fd == - 1并且errno不是您要查找的值之一时,您无法打印错误。
我运行了您的代码(作为非特权用户),并且fd以errno == EPERM
返回为-1。
您很可能不是以root身份运行。您必须以root身份运行才能获得原始套接字。