2013-12-17 115 views
2

我是網絡編程的新手,我寫了一個簡單的代碼只是爲了獲取一個捕獲的數據包中的字節數,但我無法啓動套接字(總是返回-1)這裏是代碼:套接字始終返回-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

爲什麼不從'socket'獲取'-1'後檢查'errno',理由會更清楚? (你可以通過'strerror(errno)'得到錯誤字符串) – tomasz

回答

2

您需要檢查errno證實了這一點(這將是EACCES),但失敗是因爲你的有效用戶不必使用SOCK_RAW類型的插槽許可。