Winpcap简单问题-如何发送数据包到指定的ip/端口?
-
16-09-2019 - |
题
我阅读了教程等,但我不明白。它确实可以让您发送数据包,但是您如何告诉 Winpcap 将这些数据包发送到哪里呢?我是否应该在数据包上添加任何标头,以便它知道将其转发到哪个 ip/端口?我是说。假设我想向我的 MSN 发送一些数据,就好像我给名单上的某个人写了一些东西一样。我可以使用 sendpacket(),但它只会将数据包/字节数组作为参数,而不指定发送到哪个应用程序/ip/端口。
谢谢
解决方案
您不告诉Winpcap的地方发送数据包。你告诉它把信息包在电线上。网络交换机将数据包发送到正确的目的地。在接收端的TCP堆栈将所述分组发送到合适的应用/服务。显然,这意味着路由信息必须在分组本身。
要拍你的榜样,你需要把相应的MSN服务器的IP地址和TCP端口的数据包。如果不这样做,你的网络硬件会丢弃或错误指向该数据包。
其他提示
这就是我通过线路发送 ARP 请求的方式。1.定义协议的结构,即如果您想发送 ARP 数据包,您将需要一个包含数据链路层(以太网标头)和网络层(ARP 标头)的结构。相应地,如果您想通过 IP 发送 tcp 数据包,您将需要以太网标头、ip 标头和 tcp 标头的数据结构。
定义结构后,使用所需的值初始化结构的实例,即如果您希望数据包发送到网络中的所有计算机,请将以太网标头的目标 mac 值设置为 ff:ff:ff:ff:ff:ff 如果您希望将数据包发送到具有(IP 地址 192.168. 0.88)然后将 ip 层中的目标地址设置为该值。
完成后,您需要声明一个 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);
不隶属于 StackOverflow