люди в программировании я новичёк и вот я написал программку посылающая ARP ответ
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <net/if_arp.h>
#include <net/ethernet.h>
#include <netinet/if_ether.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <string.h>
#include <net/if_arp.h>
#define ETH_HW_ADDR_LEN 6
#define IP_ADDR_LEN 4
#define ARP_FRAME_TYPE 0x0806
#define ETHER_HW_TYPE 1
#define IP_PROTO_TYPE 0x0800
#define OP_ARP_REQUEST 2
#define DEVICE "rl0"
struct arphdra {
u_short ar_hrd;
u_short ar_pro;
u_char ar_hln;
u_char ar_pln;
u_short ar_op;
u_char ar_sha[6];
u_char ar_spa[4];
u_char ar_tha[6];
u_char ar_tpa[4];
};
int main (int argc, char **argv)
{
struct arphdra arp;
struct in_addr src , dst;
struct sockaddr sos;
u_char *packet;
int sock;
int send;
if (argc != 5) { printf("ips hws ipd hwd\n"); }
packet = (char *)malloc(sizeof(struct arphdra));
sos.sa_family = PF_INET;
strcpy(sos.sa_data,DEVICE);
sock = socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
if (sock < 0) { printf("socket\n"); }
inet_aton(argv[1],&src);
inet_aton(argv[3],&dst);
arp.ar_hrd = htons(ETHER_HW_TYPE);
arp.ar_pro = htons(IP_PROTO_TYPE);
arp.ar_hln = htons(ETH_HW_ADDR_LEN);
arp.ar_pln = htons(IP_ADDR_LEN);
arp.ar_op = htons(OP_ARP_REQUEST);
memcpy(arp.ar_tha,&src,IP_ADDR_LEN);
memcpy(arp.ar_sha,argv[2],ETH_HW_ADDR_LEN);
memcpy(arp.ar_tha,&dst,IP_ADDR_LEN);
memcpy(arp.ar_sha,argv[4],ETH_HW_ADDR_LEN);
send = sendto(sock,&packet,sizeof(packet),0,&sos,sizeof(sos));
if (send < 0) { printf("sendto error\n"); }
}
не судите строга за такой примитивный
у меня вылетает ошибка sendto при отправке и вот вопрос такли я пакет составил надо ли ip загодовак хотя по rfc вроде не требуется
и тули структуру sockaddr я использовал для отправки
заранее спасибо и ещё раз не судите строго
уточнение
вместо sockaddr нужно использовать aockaddr_in это я понял
но в арп таблице ай пи появляется а физический адрес нет
может я не соблюдаю порядок байт подскажите пожалуйста
>уточнение
>вместо sockaddr нужно использовать aockaddr_in это я понял
>но в арп таблице ай пи появляется а физический адрес нет
>может я не соблюдаю порядок байт подскажите пожалуйста
арп заголовок у тебя заполняется, тока я не вижу чтоб он отправлялся.WBR, Dvorkin
спасибо это я исправлю (sendto(sock,&arp,...) но у меня возник ещё один вопрос правильно ли я физический адрес записываю в структуру?
заранее благодарен всем ответившим
>спасибо это я исправлю (sendto(sock,&arp,...) но у меня возник ещё один вопрос
>правильно ли я физический адрес записываю в структуру?
>заранее благодарен всем ответившимлично я сам на свои вопросы отвечал tcpdump'ом. :)
я тоже недавно делал нечто подобное, но с RARP.
Мне пришлось делать не SOCK_RAW, а SOCK_PACKET, чтобы полностью заполнять link-level headers. могу кинуть сорец на мыло. но уже тока в понедельник.WBR, Dvorkin
я на досуге поразмышлял посмотрел в свой исходник и у меня возник вопрос сокет мы объявили всё сделано правильно НО ядро всё равно добавляет в пакет айпи заголовок если кто знает как это обойти скажите я пробовал добавлять setsockopt
но пакет вообще не отправляется если не сложно кинь сырец на мыло в понедельник
тока я не знаю будет ли sock_packet работать во фряхе я скока не искал библиотек не нашёл заранее спасибо
Ispol'zui HDRINCL option - eto otuchit ego IP zagolovok dobavlyat'.
>я на досуге поразмышлял посмотрел в свой исходник и у меня возник
>вопрос сокет мы объявили всё сделано правильно НО ядро всё равно
>добавляет в пакет айпи заголовок если кто знает как это обойти
>скажите я пробовал добавлять setsockopt
>но пакет вообще не отправляется если не сложно кинь сырец на мыло
>в понедельник
>тока я не знаю будет ли sock_packet работать во фряхе я скока
>не искал библиотек не нашёл заранее спасибо
блин не работае добавляю я перед sendto
if (setsockopt (sock, IPPROTO_IP, IP_HDRINCL, (char *) &on, sizeof
(on))== -1){perror ("setsockopt");exit (1);}
вроде так должно быть но пакет всё павно не отправляется ругается sendto
может я делаю что то не правильно???