阅读:1534回复:3
关于多播的怪异问题
我有一个多播程序,运行在两台电脑上,当我两边加载修改后的passthru后,PC A上的多播程序可以接受B发出的多播数据,但是不能正确处理自己发出的多播数据,我做的修改就是把收到的eth包头中的type从0x0008改成0x0009,收到type为0x0009的包再改回来。调试信息显示A自己发出的数据已经被A上的passthru收到并处理了,但是为什么上层的应用程序工作不正常呢?想破了脑袋也没搞明白。希望哪位路见不平过来铲铲,多谢了。有什么地方没说清楚,欢迎大家提出来
说给分就给分,不解决问题不给啊! |
|
|
沙发#
发布于:2005-02-17 18:17
我有一个多播程序,运行在两台电脑上,当我两边加载修改后的passthru后,PC A上的多播程序可以接受B发出的多播数据,但是不能正确处理自己发出的多播数据,我做的修改就是把收到的eth包头中的type从0x0008改成0x0009,收到type为0x0009的包再改回来。调试信息显示A自己发出的数据已经被A上的passthru收到并处理了,但是为什么上层的应用程序工作不正常呢?想破了脑袋也没搞明白。希望哪位路见不平过来铲铲,多谢了。有什么地方没说清楚,欢迎大家提出来 修改了IP头,最好从新做校验 |
|
|
板凳#
发布于:2005-02-18 08:31
多谢AllenZh关心,可能我没说清楚,我修改的是eth头中的type字段。没有动IP包,我在passthru中申请内存,复制包内容,修改eth头中的type字段,如果不修改,一切都正常,如果修改,就出现了上面提到的问题。
我这样想的:既然B端的应用程序可以收到并正确处理A发出的数据,而且以证实A端的passthru也可以收到并处理自己发出的数据,为何A端的应用程序却不能正确处理数据?是否少作了什么动作?可是不修改Type字段时又可以正确运行,说明如OID_802_3_MULTICAST_LIST这样的请求正确的执行了。 疑惑中。。。。 |
|
|
地板#
发布于:2005-02-18 14:31
passthru中修改包的代码如下,比较粗糙。
当我把 pETH->Type = 0x0009 改成 pETH->Type = 0x0008 一切正常,没天理啊! NDIS_STATUS doCompressPacket2 ( IN PUCHAR pPacketData, IN ULONG OrigLen, OUT PUCHAR * ppNewPacketData, OUT PULONG pNewLen) { NDIS_STATUS Status = NDIS_STATUS_SUCCESS; PUCHAR pOutputPacket = NULL; ULONG OutputPacketLen; pEthHdr pETH = NULL; static ULONG compressed = 0; Status = NdisAllocateMemoryWithTag(&pOutputPacket, OrigLen, COMPTAG); if (Status != NDIS_STATUS_SUCCESS) { *ppNewPacketData = NULL; *pNewLen = 0; NEW_WARNING(("COMP: Allocate Memory Failed!n")); return Status; } NdisMoveMemory(pOutputPacket, pPacketData, OrigLen); pETH = (pEthHdr)pOutputPacket; if (pETH->Type == 0x0008) { if (++compressed % 1000 == 0) { NEW_DEBUG(("v.5 COMPRESSED %dn", compressed)); } pETH->Type = 0x0009; } else { NEW_DEBUG(("pETH->Type = 0x%0Xn", pETH->Type)); } *ppNewPacketData = pOutputPacket; *pNewLen = OrigLen; return NDIS_STATUS_SUCCESS; } NDIS_STATUS doDecompressPacket2 ( IN PUCHAR pPacketData, IN ULONG OrigLen, OUT PUCHAR *ppNewPacketData, OUT PULONG pNewLen ) { PUCHAR pOutputPacket; INT OutputPacketLen; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; static ULONG decompressed = 0; pEthHdr pETH = NULL; *ppNewPacketData = NULL; *pNewLen = 0; Status = NdisAllocateMemoryWithTag(&pOutputPacket, OrigLen, COMPTAG); if (Status != NDIS_STATUS_SUCCESS) { NEW_WARNING(("COMP: Allocate Memory Failed!n")); return Status; } NdisMoveMemory(pOutputPacket, pPacketData, OrigLen); pETH = (pEthHdr)pOutputPacket; if (pETH->Type == 0x0009) { if (++decompressed % 1000 == 0) { NEW_DEBUG(("v.5 DECOMPRESSED %dn", decompressed)); } pETH->Type = 0x0008; } *ppNewPacketData = pOutputPacket; *pNewLen = OrigLen; return NDIS_STATUS_SUCCESS; } [编辑 - 2/18/05 by jasonxia74] |
|
|