阅读:1228回复:1
!!!!!求教NAT开发中的问题.附部分源码
我利用Passthru开发NAT,需做的工作是简单转发数据.
第一步:在PtReceive中接收处理感兴趣的数据包,如只处理2000端口的数据包 第二步:将收到到的数据拷贝到指定缓冲区 第三步:修改IP头和MAC头,重算校验和 第四步:调用NdisSend接口转发数据 第五步:释放资源 结果是数据被成功转发到对应的机器上,但是数据没被应用层接收.我在一端采用UDP2000端口发包,通过PassThru转发发数据包,在另一端通过抓包软件得知修改后的数据已经被发送到目标机器.但是目标机器接收到信息后并没有交与我应用层的接收程序? 请问是什么原因呢? 附部分源码: pMyIpHead = (PIP_HEADER)(pPacketMemory+14); pMyUdpHead = (PUDP_HEAD)(pPacketMemory+14+20); IP_Addr = pMyIpHead->IP_DA ;//= 0x0100a8c0 ;//192.168.0.1 pMyIpHead->IP_DA = pMyIpHead->IP_SA; pMyIpHead->IP_SA = IP_Addr; GenCheckSum((UCHAR*)(pPacketMemory+14)); CalculateChecksum((PVOID)(pPacketMemory+14), 1); NdisAllocateBuffer(&Status, &PacketBuffer, pAdapt->SendPacketPoolHandle, pPacketMemory, PacketLen); if (Status!=NDIS_STATUS_SUCCESS) { NdisDprFreePacket(MyPacket); NdisFreeMemory(pPacketMemory,PacketLen,0); return Status; } SendRsvd = (PSEND_RSVD)(MyPacket->MiniportReserved); SendRsvd->OriginalPkt = MyPacket; NdisChainBufferAtFront(MyPacket, PacketBuffer); NdisFreeMemory(pPacketMemory,PacketLen,0); MyPacket->Private.Flags = NdisGetPacketFlags(Packet); NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), NDIS_OOB_DATA_FROM_PACKET(Packet), sizeof(NDIS_PACKET_OOB_DATA)); NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, &MediaSpecificInfo, &MediaSpecificInfoSize); if (MediaSpecificInfo || MediaSpecificInfoSize) { NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, MediaSpecificInfo, MediaSpecificInfoSize); } is_send=TRUE; NdisSend(&Status, pAdapt->BindingHandle, MyPacket); if (Status != NDIS_STATUS_PENDING) { #ifndef WIN9X NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); #endif NdisUnchainBufferAtFront(MyPacket ,&PacketBuffer); NdisFreePacket(MyPacket); ADAPT_DECR_PENDING_SENDS(pAdapt); //NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt), // Packet, // Status); } |
|
沙发#
发布于:2008-03-13 15:15
既然对放能收到,那肯定不是passthru发包的问题.应该和数据有关系吧.
你贴他包代码也没他大用. |
|