私はC言語でrawソケットを扱っています。 生のイーサネットパケットを送受信する必要があります。 パケットは、IEEE 802.3ヘッダで始まる必要があり:RAWソケット - Ethertypeと受信アルゴリズム - C
MAC DST [0-5] - MAC SRC [6-11] - ETHタイプ[12-13]
はWiresharkのでパケットをキャッチI - MAC SRC [6-11] - LENGTH [12-13] - 予告編[14から58] -....
この
MAC DST [0-5]:下記の構造を参照してください私のコード:
...
sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
memcpy(ptr_eth_header->DstMac, dst_mac, 6);
memcpy(ptr_eth_header->SrcMac, src_mac, 6);
ptr_eth_header->Type = htons(ETH_P_802_3);
memcpy(buffer + ETHHDR_SIZE, data, 60);
...
sockaddr.sll_family = htons(PF_PACKET);
sockaddr.sll_protocol = htons(ETH_P_802_3);
sockaddr.sll_ifindex = ifr.ifr_ifru.ifru_ivalue;
sockaddr.sll_halen = 6;
memcpy(&(sockaddr.sll_addr), dst_mac, 6);
...
bytes = sendto(sraw, buffer, sizeof(buffer), 0, (struct sockaddr *) &(sockaddr), sizeof (struct sockaddr_ll));
wiresharkの「問題」ですか?何か案は?
私の2番目の問題は、生のメッセージの受信に関することです。 プロセスがrecvfromで停止しています。
これは私のコードです:
sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
val = CLIENT_PACKET_SIZE;
retVal = setsockopt(sraw, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val));
sockaddr.sll_family = htons(PF_PACKET);
sockaddr.sll_ifindex = ifr.ifr_ifindex;
sockaddr.sll_protocol = htons(ETH_P_802_3);
buffer = malloc(CLIENT_PACKET_SIZE * sizeof(char));
while (count < PACKET_COUNT) {
bytes = recvfrom(sraw, buffer, CLIENT_PACKET_SIZE, 0, (struct sockaddr *)&sockaddr, (socklen_t*)sizeof(sockaddr));
...
}
あなたは私を助けてもらえますか?
ありがとうございます!
ヘッダー構造はパックされていますか? 'sizeof(バッファ)'とは何ですか? –
はい、そうです。 'typedef struct { char DstMac [6]; char SrcMac [6]; short int型; } HEADER; ' ' sizeof(buffer) 'は64です。 – Simone
あなたのプログラムとは無関係にWiresharkを使ってNICがパケットを送受信していることを確認できますか? – Ioan