#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;
#include <netdb.h>;
#include <arpa/inet.h>;
#include <netinet/in.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <sys/ioctl.h>;
#include <net/if.h>;
#include <net/if_arp.h>;
#include <net/ethernet.h>;
#include <signal.h>;
#include <netinet/ip.h>;
#include <errno.h>;
int errno ;
struct in_addr myself,mymask;
int fd_arp;
struct ifreq ifr;
int main(int argc,char* argv[])
{
char device[32];
struct sockaddr from,to;
int fromlen;
struct sockaddr_in *sin_ptr;
u_char *ptr;
int n;
strcpy(device,"lo";

if((fd_arp=socket(AF_INET,SOCK_PACKET,htons(0x0806)))<0)
{
perror("arp socket error";

printf("Open Socket Error:%d fd:%d\n", errno,fd_arp);
exit(-1);
}
strcpy(ifr.ifr_name,device);
if(ioctl(fd_arp,SIOCGIFADDR,&ifr)<0)
{
perror("ioctl SIOCGIFADDR error";

exit(-1);
}
sin_ptr=(struct sockaddr_in *)&ifr.ifr_addr;
myself=sin_ptr->;sin_addr;
// get network mask
if(ioctl(fd_arp,SIOCGIFNETMASK,&ifr)<0)
{
perror("ioctl SIOCGIFNETMASK error";

exit(-1);
}
sin_ptr=(struct sockaddr_in *)&ifr.ifr_addr;
mymask=sin_ptr->;sin_addr;
// get mac address
if(ioctl(fd_arp,SIOCGIFHWADDR,&ifr)<0)
{
perror("ioctl SIOCGIFHWADDR error";

exit(-1);
}
ptr=(u_char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
printf("\nrequest mac %02x:%02x:%02x:%02x:%02x:%02x,",
*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));
printf("\nrequest netmask %s",inet_ntoa(mymask));
printf("\nrequest IP %s\n",inet_ntoa(myself));
exit(0) ;
}
这段代码中, if((fd_arp=socket(AF_INET,SOCK_PACKET,htons(0x0806)))<0) 为什么不能创建,总是返回
arp socket error: Operation not permitted
Open Socket Error:29 fd:-1
为什么第三个参数是个整数啊.
我在RedHat Linux9.0 下编译是OK了, 就是不能创建socket.
我的编译: g++ -o filemac filemac.cpp .........OK
g++ : gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)