Я пытаюсь отправить пакет (не IP-пакет, но идентификатор запроса EAP), но функция send() возвращает -1 ,«Требуется адрес назначения» при попытке отправить данные через сокет SOCK_RAW
int sockfd = socket(AF_INET, SOCK_RAW, 0);
printf("socket: %d\n", sockfd);
struct sockaddr_in sock;
printf("creating packet\n");
char packet[27];
memcpy(packet + 0, (u_char*) ethernet->ether_dhost, 6);
memcpy(packet + 6, (u_char*) ethernet->ether_shost, 6);
memcpy(packet + 12, (u_char*) ethernet + 12, 2);
memcpy(packet + 14, (u_char *)reqid, 1);
memcpy(packet + 15, (u_char *)reqid+1, 1);
memcpy(packet + 16, (u_char *)reqid+2, 4);
memcpy(packet + 20, (u_char *)reqid+6, 1);
memcpy(packet + 21, (u_char *)reqid+7, 1);
memcpy(packet + 22, (u_char *)reqid+8, 4);
memcpy(packet + 26, (u_char *)reqid+12, 1);
printf("sending packet\n");
if(send(sockfd, packet, sizeof(packet), 0) == -1)
{
printf("packet not sent\n");
//return;
}
Пакет состоит из пакета ethernet и идентификатора запроса. Я знаю, что пакет в порядке, и каждое значение находится в нужном месте. но функция send() не работает.
errno show «Требуется адрес назначения», а значение sockfd равно 4. Это, кстати, на FreeBSD.
Спасибо EDIT: У меня нет IP-адреса получателя. У меня есть только его MAC-адрес.
Что такое 'errno'? Действительно ли 'sockfd'? Для ISTR 'SOCK_RAW' требуется root –
@LightnessRacesinOrbit Требуется адрес назначения. – ipinlnd
@LightnessRacesinOrbit также, да ** sockfd ** действителен. его значение равно 4. и я нахожусь в корневом пользователе. – ipinlnd