люди в программировании я новичёк и вот я написал программку посылающая 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 я использовал для отправки
заранее спасибо и ещё раз не судите строго
|