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);
}
感謝
也許你沒有足夠的權限來使用'SOCK_RAW'。什麼是'errno'?系統調用失敗時使用'perror'是個好主意。 –
SOCK_RAW需要root權限。如果您只想發送數據包,請使用SOCK_STREAM(如TCP)或SOCK_DGRAM(如UDP)。 – JvO
爲什麼不從'socket'獲取'-1'後檢查'errno',理由會更清楚? (你可以通過'strerror(errno)'得到錯誤字符串) – tomasz