jasonxia74
驱动牛犊
驱动牛犊
  • 注册日期2004-10-29
  • 最后登录2005-06-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1534回复:3

关于多播的怪异问题

楼主#
更多 发布于:2005-02-17 18:02
我有一个多播程序,运行在两台电脑上,当我两边加载修改后的passthru后,PC A上的多播程序可以接受B发出的多播数据,但是不能正确处理自己发出的多播数据,我做的修改就是把收到的eth包头中的type从0x0008改成0x0009,收到type为0x0009的包再改回来。调试信息显示A自己发出的数据已经被A上的passthru收到并处理了,但是为什么上层的应用程序工作不正常呢?想破了脑袋也没搞明白。希望哪位路见不平过来铲铲,多谢了。有什么地方没说清楚,欢迎大家提出来

说给分就给分,不解决问题不给啊!
我本将心向明月 奈何明月照沟渠
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-17 18:17
我有一个多播程序,运行在两台电脑上,当我两边加载修改后的passthru后,PC A上的多播程序可以接受B发出的多播数据,但是不能正确处理自己发出的多播数据,我做的修改就是把收到的eth包头中的type从0x0008改成0x0009,收到type为0x0009的包再改回来。调试信息显示A自己发出的数据已经被A上的passthru收到并处理了,但是为什么上层的应用程序工作不正常呢?想破了脑袋也没搞明白。希望哪位路见不平过来铲铲,多谢了。有什么地方没说清楚,欢迎大家提出来

说给分就给分,不解决问题不给啊!

修改了IP头,最好从新做校验
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
jasonxia74
驱动牛犊
驱动牛犊
  • 注册日期2004-10-29
  • 最后登录2005-06-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-18 08:31
多谢AllenZh关心,可能我没说清楚,我修改的是eth头中的type字段。没有动IP包,我在passthru中申请内存,复制包内容,修改eth头中的type字段,如果不修改,一切都正常,如果修改,就出现了上面提到的问题。
我这样想的:既然B端的应用程序可以收到并正确处理A发出的数据,而且以证实A端的passthru也可以收到并处理自己发出的数据,为何A端的应用程序却不能正确处理数据?是否少作了什么动作?可是不修改Type字段时又可以正确运行,说明如OID_802_3_MULTICAST_LIST这样的请求正确的执行了。
疑惑中。。。。
我本将心向明月 奈何明月照沟渠
jasonxia74
驱动牛犊
驱动牛犊
  • 注册日期2004-10-29
  • 最后登录2005-06-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
我本将心向明月 奈何明月照沟渠
游客

返回顶部