パケットを送信しようとしましたが、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;
}
パケットはイーサネットパケットと要求IDで構成されています。 パケットは問題なく、すべての値が適切な場所にあることがわかります。 send()関数は失敗します。
"宛先アドレスが必要です"と表示され、sockfdの値は4です。 これは、ところでFreeBSD上にあります。
ありがとう EDIT:私は宛先のIPアドレスを持っていません。私はそのMACアドレスしか持っていません。マンページから
「errno」とは何ですか? 'sockfd'は有効ですか? ISTR 'SOCK_RAW'はルートが必要です –
@LightnessRacesinOrbit宛先アドレスが必要です。 – ipinlnd
@LightnessRacesinOrbitまた、はい** sockfd **が有効です。その値は4で、私はrootユーザーです。 – ipinlnd