在c中接收原始以太网数据包

时间:2013-07-17 09:23:46

标签: c sockets ethernet raw-sockets

我发送了两个用于发送和接收原始以太网数据包的程序。我可以发送数据包,我可以接收,但我的接收器有两个问题。

首先:所有包都是重复的,这意味着所有的包中都会显示两次。它只能连接2个虚拟网络接口。(例如src tap0 mac 00:00:8F:00:00:02 - > dest tap1 mac 00:00:8F:00:00:03)

第二:网络中的所有数据包都是从我的程序接收到的,但它应该从特定接口接收数据包。

信息:我在VirtualBox中使用Ubuntu 12.04.01 LTS

这是我的接收者代码:

/*read while first char not * */
while(frame.data[0] != '*'){
    length_in_byte = recvfrom(sock_desc, buffer, ETH_FRAME_LEN,0,NULL,NULL);
    if(length_in_byte == -1){
        error handling
    }

    frame.dest_mac[0] = buffer[0];
    frame.dest_mac[1] = buffer[1];
    frame.dest_mac[2] = buffer[2];
    frame.dest_mac[3] = buffer[3];
    frame.dest_mac[4] = buffer[4];
    frame.dest_mac[5] = buffer[5];

    frame.src_mac[0] = buffer[6];
    frame.src_mac[1] = buffer[7];
    frame.src_mac[2] = buffer[8];
    frame.src_mac[3] = buffer[9];
    frame.src_mac[4] = buffer[10];
    frame.src_mac[5] = buffer[11];

    for(dataRun = 14; dataRun < length_in_byte; dataRun++){
        frame.data[dataRun-14] = buffer[dataRun];
    }
    /*print struct*/
    printf("\n");
    printf("src: %02x:%02x:%02x:%02x:%02x:%02x\t->\tdest: %02x:%02x:%02x:%02x:%02x:%02x\n",frame.src_mac[0],frame.src_mac[1],frame.src_mac[2],frame.src_mac[3],frame.src_mac[4],frame.src_mac[5],frame.dest_mac[0],frame.dest_mac[1],frame.dest_mac[2],frame.dest_mac[3],frame.dest_mac[4],frame.dest_mac[5]);
    printf("Data: %s\n", frame.data);

}

终端输出: 发送数据=测试

src: 00:00:8f:00:00:03  ->  dest: 00:00:8f:00:00:02
Data: test

src: 00:00:8f:00:00:03  ->  dest: 00:00:8f:00:00:02
Data: test

发送数据= a

src: 00:00:8f:00:00:03  ->  dest: 00:00:8f:00:00:02
Data: a

src: 00:00:8f:00:00:03  ->  dest: 00:00:8f:00:00:02
Data: a

src: 00:00:8f:00:00:03  ->  dest: 33:33:00:00:00:fb
Data: `

src: 00:00:8f:00:00:03  ->  dest: 33:33:00:00:00:fb
Data: `

2 个答案:

答案 0 :(得分:0)

第一个问题:

while循环" while(frame.data[0] != '*') "导致数据包重复。也许您还必须检查数据包是否碎片

答案 1 :(得分:0)

我找到了解决我的复制问题的解决方案,它不是我的程序源代码。

问题是来自虚拟以太网设备的连接,我已将连接方法tap0更改为tap1。

我还使用了vde_switch。对于问题二,我必须找到一个过滤器。

非常感谢你的帮助

相关问题