2013-12-17 3 views
2

Я новичок в сетевом программировании, я написал простой код, чтобы получить несколько байтов в захваченном пакете, но я не могу начать сокет (всегда возвращать -1) вот код:socket всегда возвращает -1

#include<stdio.h> 
#include<arpa/inet.h> 
#include<string.h> 
#include<stdlib.h> 
#include<sys/ioctl.h> 
#include<sys/socket.h> 
#include<net/if.h> 
//#include<netinet/either.h> 
#define ETHER_TYPE 0x0800 

void main() 
{ 
struct ifreq ifopts; 
ssize_t numbytes=0; 
int sockfd; 
char ifname="eth0"; 
uint8_t buf[1024]; 

if((sockfd=socket(AF_INET,SOCK_RAW,0))<0) 
{ 
printf("couldnt start socket \nsockfd = %d\n",sockfd); 
exit(1); 
} 
strncpy(ifopts.ifr_name,ifname,sizeof(ifname)-1); 
ioctl(sockfd,SIOCSIFFLAGS,&ifopts); 
ifopts.ifr_flags |= IFF_PROMISC; 
ioctl(sockfd,SIOCSIFFLAGS,&ifopts); 
if((setsockopt(sockfd,SOL_SOCKET,SO_BINDTODEVICE,ifname,sizeof(ifname)-1))<0) 
printf("couldnt bind \n"); 
numbytes=recvfrom(sockfd,buf,1024,0,NULL,NULL); 
printf("got packet with size %d",numbytes); 
} 

благодарит

+10

Возможно, у вас недостаточно прав на использование 'SOCK_RAW'. Что такое 'errno'? Рекомендуется использовать 'perror' при сбое системного вызова. –

+2

SOCK_RAW требует прав root. Если все, что вы хотите сделать, это отправить пакеты, используйте SOCK_STREAM (например, TCP) или SOCK_DGRAM (например, UDP). – JvO

+1

Почему бы не проверить 'errno' после получения' -1' из 'socket', поэтому причина была бы более понятной? (вы можете получить строку с ошибкой с помощью 'strerror (errno)') – tomasz

ответ

2

Вам нужно будет проверить errno, чтобы подтвердить это (это будет EACCES), но неудача в том, что ваш эффективный пользователь не имеет разрешения на использование сокетов типа SOCK_RAW.

Смежные вопросы