2012-03-12 10 views
3

私は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)); 
    ... 
} 

あなたは私を助けてもらえますか?

ありがとうございます!

+0

ヘッダー構造はパックされていますか? 'sizeof(バッファ)'とは何ですか? –

+1

はい、そうです。 'typedef struct { char DstMac [6]; char SrcMac [6]; short int型; } HEADER; ' ' sizeof(buffer) 'は64です。 – Simone

+0

あなたのプログラムとは無関係にWiresharkを使ってNICがパケットを送受信していることを確認できますか? – Ioan

答えて

0

あなたの質問に対する一言の回答は難しいです。しかし、あなたのコードでrecvfromがスタックされているのかもしれないと私に尋ねるならば、私はあなたがあなたのフィルタ条件を満たすパケットを受け取っていないかもしれないと言います。 ifindex値を予想される形式で渡していますか?私はあなたがifindexを渡すのを見ますsockaddr.sll_ifindex = ifr.ifr_ifru.ifru_ivalue;これはsendtoのように。

その他の理由として、ソケットで設定したバッファーサイズがカーネルでサポートされていないか、カーネルのバッファーが不足しているなどの理由が考えられます。これらのいずれかの可能性は最小限です。

また、あなたのシナリオでは、私はブロッキングの代わりにノンブロッキングソケットを使用することをお勧めします。読み込み待ちのパケットがあることが分かっている場合にのみ、recvfromを呼び出します。

関連する問題