Winpcap简单的问题 - 如何发送数据包到指定的IP /端口?

问题描述:

我阅读教程等,但我没有得到它。它确实可以让你发送数据包,但是你怎么能告诉Winpcap在哪里发送这些数据包呢?是否有任何头应该放在数据包上,以便知道将哪个IP /端口转发给它?我的意思是。假设我想将一些数据发送给我的MSN,就好像我已经给列表中的某个人写了一些内容。我可以使用sendpacket(),但它只会将数据包/字节数组作为参数,而不是指定将哪个app/ip/port发送给它。Winpcap简单的问题 - 如何发送数据包到指定的IP /端口?

谢谢

你不告诉Winpcap在哪里发送数据包。你告诉它把一个数据包放在电线上。网络交换机将把数据包发送到正确的目的地。接收端的TCP堆栈将把数据包发送到正确的应用程序/服务。显然这意味着路由信息必须位于数据包本身中。

举一个例子,你需要把相应的MSN服务器的IP地址和TCP端口放在数据包中。如果你不这样做,你的网络硬件会丢弃或误导这个数据包。

+0

呀,2分钟前,我想过这样的其余部分。我创建一个数据包,在那里设置信息,然后发送它。不管怎么说,还是要谢谢你! – 2009-08-14 14:57:02

这就是我通过电线发送ARP请求的方式。 1.定义协议的结构,即如果你想发送ARP数据包,你需要一个包含数据链路层(以太网报头)和网络层(ARP报头)的结构。相应地,如果你想通过IP发送一个tcp数据包,你将需要一个数据结构用于以太网报头,ip报头和tcp报头。

  1. 一旦你定义的结构,如果你想包去网络中设置以太网头FF的目的MAC值的所有机器初始化值你想即结构的一个实例:FF :ff:ff:ff:ff如果要将数据包发送到机器X(IP地址为192.168.0.88),则将ip层中的目标地址设置为该值。

  2. 完成后,您将需要声明一个char *数组并将所有结构复制到char *数组以创建一个字节序列并通过线路发送它。

//只是为了告诉你什么是我定义的结构意味着不//涉及到的代码片段

typedef struct IP_header 
{ 
    u_char  VersionNInternetHeaderLength;  // Version (4 bits) + Internet header length (4 bits) 
    /*u_char  version:4; 
    u_char  HeaderLength:4;*/ 
    u_char  Type;        // Type of service 
    u_short  TotalLength;      // Total length 
    u_short  Identification;      // Identification 

    u_char  rsv  : 1; 
    u_char  df  : 1; 
    u_char  mf  : 1; 

    u_char  FragmentOffset1 : 5; 
    u_char  FragmentOffset2; 
    //u_short  Flags_fo;       // Flags (3 bits) + Fragment offset (13 bits) 

    u_char  TimeToLive;       // Time to live 
    u_char  Protocol;       // Next level Protocol of the encapsulated payload 
    u_short  Checksum;       // Header checksum 
    IP_address SourceAddress;      // Source address 
    IP_address DestinationAddress;     // Destination address 
    u_int  OptionNPadding;      // Option + Padding 

    IP_header() 
    { 
     mf = 0; 
     rsv = 0; 
     df = 0; 
     FragmentOffset1 = 0; 
     FragmentOffset2 = 0; 

     TimeToLive = 128; 

     TotalLength = sizeof(IP_header); 
     Identification = 0xABCD; 
     Checksum = 0xABCD; 
     OptionNPadding = 0; 
    } 
}IP_header; 


Ethernet_header EthernetHeader;// = (Ethernet_header*)malloc(sizeof(Ethernet_header)); 
     ARP_header ARPHeader ;//= (ARP_header*)malloc(sizeof(ARP_header)); 

     ARPHeader.HardwareType = htons(1); 
     ARPHeader.ProtocolType = htons(0x800); 
     ARPHeader.OPCODE = htons(1); 

     ARPHeader.HeaderLength = 6; 
     ARPHeader.ProtocolLength = 4; 

     ARPHeader.SenderMAC = MY_FAKE_MAC; 
     ARPHeader.SenderIP = MY_IP; 

     ARPHeader.TargetMAC = MAC_address(); 
     ARPHeader.TargetIP = Whose; 

     EthernetHeader.DestinationMAC = BROADCASTMAC; 
     EthernetHeader.SourceMAC = MY_FAKE_MAC; 
     EthernetHeader.EtherType = htons(0x806); 

     u_char* packet = (u_char*)malloc(sizeof(EthernetHeader) + sizeof(ARPHeader)); 

     memcpy(packet, &EthernetHeader, sizeof(EthernetHeader)); 
     memcpy(packet + sizeof(EthernetHeader), &ARPHeader, sizeof(ARPHeader)); 

     SendPacket(packet);