如何同时发送和接收数据包

时间:2019-09-05 17:29:35

标签: linux networking udp icmp raw-sockets

我正在使用C语言中的SOCK_RAW每秒钟将UDP数据包发送到特定的源,但是我也想同时捕获数据包(嗅探),如果从该源接收到数据包,那么我将开始发送不同的消息

我已经实现了发送UDP数据包的一部分。

 #include <stdio.h>
 #include <string.h>
 #include <sys/socket.h>
 #include <netinet/ip.h>
 #include <arpa/inet.h>

 #include "myheader.h"

 void   send_raw_ip_packet (struct ipheader* ip);

 /******************************************************************
  Spoof a UDP packet using an arbitrary source IP Address and port
 *******************************************************************/
 int main() {
    char buffer[1500];

    memset(buffer, 0, 1500);
    struct ipheader *ip = (struct ipheader *) buffer;
    struct udpheader *udp = (struct udpheader *) (buffer +
                                       sizeof(struct ipheader));

    /*********************************************************
    Step 1: Fill in the UDP data field.
    ********************************************************/
    char *data = buffer + sizeof(struct ipheader) +
                      sizeof(struct udpheader);
    const char *msg = "Hello Server!\n";
    int data_len = strlen(msg);
    strncpy (data, msg, data_len);

    /*********************************************************
     Step 2: Fill in the UDP header.
     ********************************************************/
    udp->udp_sport = htons(12345);
    udp->udp_dport = htons(9090);
    udp->udp_ulen = htons(sizeof(struct udpheader) + data_len);
    udp->udp_sum =  0; /* Many OSes ignore this field, so we do not
                      calculate it. */

    /*********************************************************
     Step 3: Fill in the IP header.
     ********************************************************/
    ip->iph_ver = 4;
    ip->iph_ihl = 5;
    ip->iph_ttl = 20;
    ip->iph_sourceip.s_addr = inet_addr("1.2.3.4");
    ip->iph_destip.s_addr = inet_addr("10.0.2.69");
    ip->iph_protocol = IPPROTO_UDP; // The value is 17.
    ip->iph_len = htons(sizeof(struct ipheader) +
                    sizeof(struct udpheader) + data_len);

    /*********************************************************
    Step 4: Finally, send the spoofed packet
    ********************************************************/
    send_raw_ip_packet (ip);

    return 0;
 }

我如何同时嗅探并发送不同的回复?

0 个答案:

没有答案