2011-11-11 8 views
0

私はcでraw ethernetプログラミングを行っています。私は2つのファイルをクライアントとローカルホスト上で実行されているサーバーがあります。 socket()で通信するために私自身のプロトコル番号を使用しています。クライアント側ではローカルEthernet上の未加工イーサネットPF_PACKET問題

私はコード

s = socket(PF_PACKET, SOCK_RAW, 61187); 
    unsigned char dest_mac[6]= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 
    struct sockaddr_ll socket_address; 

     socket_address.sll_family = PF_PACKET; 
     socket_address.sll_protocol = 61187; 
     socket_address.sll_ifindex = ifindex; 
     socket_address.sll_hatype = ARPHRD_ETHER; 
     socket_address.sll_pkttype = PACKET_BROADCAST; 
     socket_address.sll_halen = ETH_ALEN; 
     socket_address.sll_addr[0] = dest_mac[0]; 
     socket_address.sll_addr[1] = dest_mac[1]; 
     socket_address.sll_addr[2] = dest_mac[2]; 
     socket_address.sll_addr[3] = dest_mac[3]; 
     socket_address.sll_addr[4] = dest_mac[4]; 
     socket_address.sll_addr[5] = dest_mac[5]; 
     socket_address.sll_addr[6] = 0x00; 
     socket_address.sll_addr[7] = 0x00; 

をfollwingしているし、私はいくつかのデータを送信し、サーバ側で

sent = sendto(s, buffer, ETH_HEADER_LEN, 0, (struct sockaddr*)&socket_address, sizeof(socket_address)); 

を次のように私は、クライアントのようにソケットの作成を行うと、私はのrecvfromをしています次のように:

length = recvfrom(s, buffer, BUF_SIZE, 0, NULL, NULL); 

しかし、私はサーバー側で任意のパケットを受け取りません。誰でも私に問題の内容を教えてもらえますか?

答えて

0

あなたの不完全な例からは分かりませんが、を使用する場合はSOCK_RAWを使用していると思われます。 SOCK_RAWでは、イーサネットヘッダーは指定したbufferの一部とみなされます。つまり、宛先アドレスの設定はパケットの内容とは関係ありません。 SOCK_DGRAMでは、bufferの内容が生成されたイーサネットフレームのペイロードを形成し、ヘッダはアドレスフィールドから来ます。

tcpdump -neX(またはWiresharkまたはtsharkと同等のもの)をテスト中に実行させると、この種のデバッグは非常に簡単です。生成するパケットは正確に分かります。

関連する問題