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);
}
благодарит
Возможно, у вас недостаточно прав на использование 'SOCK_RAW'. Что такое 'errno'? Рекомендуется использовать 'perror' при сбое системного вызова. –
SOCK_RAW требует прав root. Если все, что вы хотите сделать, это отправить пакеты, используйте SOCK_STREAM (например, TCP) или SOCK_DGRAM (например, UDP). – JvO
Почему бы не проверить 'errno' после получения' -1' из 'socket', поэтому причина была бы более понятной? (вы можете получить строку с ошибкой с помощью 'strerror (errno)') – tomasz