全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4236
推到 Plurk!
推到 Facebook!

关于NMUDP元件发送广播的探讨

答題得分者是:RaynorPao
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-09 10:47:24 IP:218.17.xxx.xxx 未訂閱
各位大大,小弟利用BCB中提供的NMUDP元件发送广播字串, remotehost是:255.255.255.255,remoteport:192;内容 是“01 00 00 00.......00 00 00”,但是发送时出息错误。 请问一下要如何利用NMUDP发送上面的内容呢? 我曾试着将remotehost设定为:192.168.0.255,来发送,对于 简单的网络他是可以达到广播的目的,但是如果机器的IP是 192.168.12.X,这时发送192.168.12.255,就不能正确返回。 我也试过用Indy9011中的元件,他可以发送广播,但类型是AnsiString, 如果我发送“01 00 00 ..... 00 ”则不行,因为他会将00看到是这个 字串的结束,所以结果他发出去的,只是“01”,后面的“00”都没有 发送出去。 我又试图找其他元件,但又没有找到好用的,所以恳请各位高手指点一下 小弟为什么NMUDP不能发送255.255.255.255这样的广播,还有就是谁那里 可以发送类似“01 00 00 .... 00 00”的广播字串的元件,谢谢您。 下面是小弟利用NMUDP发送广播的测试代码(失败,出现错误): //--------------------------------------------------------------------------- void __fastcall TMain_Frm::SendBroadcastOID(void) { //AP1000 or OR char buffer[1024]; buffer[0]=0x01; for(int i=1;i<=115;i ) buffer[i]=0x00; NMUDP1->SendBuffer(buffer,116,116); } //--------------------------------------------------------------------------- void __fastcall TMain_Frm::Exit_BtnClick(TObject *Sender) { NMUDP1->RemoteHost=255.255.255.255; NMUDP1->RemotePort=192; SendBroadcastOID(); }
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-09 22:07:54 IP:61.221.xxx.xxx 未訂閱
引言: 各位大大,小弟利用BCB中提供的NMUDP元件发送广播字串, remotehost是:255.255.255.255,remoteport:192;内容 是“01 00 00 00.......00 00 00”,但是发送时出息错误。 请问一下要如何利用NMUDP发送上面的内容呢? 我曾试着将remotehost设定为:192.168.0.255,来发送,对于 简单的网络他是可以达到广播的目的,但是如果机器的IP是 192.168.12.X,这时发送192.168.12.255,就不能正确返回。 我也试过用Indy9011中的元件,他可以发送广播,但类型是AnsiString, 如果我发送“01 00 00 ..... 00 ”则不行,因为他会将00看到是这个 字串的结束,所以结果他发出去的,只是“01”,后面的“00”都没有 发送出去。 我又试图找其他元件,但又没有找到好用的,所以恳请各位高手指点一下 小弟为什么NMUDP不能发送255.255.255.255这样的广播,还有就是谁那里 可以发送类似“01 00 00 .... 00 00”的广播字串的元件,谢谢您。 下面是小弟利用NMUDP发送广播的测试代码(失败,出现错误): //--------------------------------------------------------------------------- void __fastcall TMain_Frm::SendBroadcastOID(void) { //AP1000 or OR char buffer[1024]; buffer[0]=0x01; for(int i=1;i<=115;i ) buffer[i]=0x00; NMUDP1->SendBuffer(buffer,116,116); } //--------------------------------------------------------------------------- void __fastcall TMain_Frm::Exit_BtnClick(TObject *Sender) { NMUDP1->RemoteHost=255.255.255.255; NMUDP1->RemotePort=192; SendBroadcastOID(); }
I_Love_You 你好:
好久不見了,近來可好?? 先試試看這一段程式碼是否能用??    >    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-09 23:14:41 IP:218.17.xxx.xxx 未訂閱
RaynorPao您好,每次来这里都发现您是更上一层楼, 而提供我建议和方法的又有您和其他的各位大大,真的是谢谢你们。 您提供的代码我测试了,但没有成功。 首先在编译的时候就出现问题, 例如:sendto(hbSock,pkt,5000,0,&to,sizeof(to)); 中to是SOCKADDR_IN to; 而sendto函数要求的定义是sockaddr类型, 我看了一下他们的结构,SOCKADDR_IN要完善一些,但不能在sendto中用。 我还有一个疑问就是: 我见到其他软件有发送广播字串的,利用抓包工具抓下来分析, 发现他们的端口并不是0,而是192,或者其他的,这是怎么回事呢? 希望您和其他各位高手们指点指点小弟,先谢谢了,谢谢!!!!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-10 00:42:51 IP:61.221.xxx.xxx 未訂閱
引言: RaynorPao您好,每次来这里都发现您是更上一层楼, 而提供我建议和方法的又有您和其他的各位大大,真的是谢谢你们。 您提供的代码我测试了,但没有成功。 首先在编译的时候就出现问题, 例如:sendto(hbSock,pkt,5000,0,&to,sizeof(to)); 中to是SOCKADDR_IN to; 而sendto函数要求的定义是sockaddr类型, 我看了一下他们的结构,SOCKADDR_IN要完善一些,但不能在sendto中用。 我还有一个疑问就是: 我见到其他软件有发送广播字串的,利用抓包工具抓下来分析, 发现他们的端口并不是0,而是192,或者其他的,这是怎么回事呢? 希望您和其他各位高手们指点指点小弟,先谢谢了,谢谢!!!!
I_Love_You 你好:
(1)針對你的第一個問題,我還沒有時間試,先麻煩你參考這篇文章的做法
    >
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-11 18:04:56 IP:218.17.xxx.xxx 未訂閱
RaynorPao大大,您提供的这个资料我测试过,但其中也遇到几个问题, 他会出现错误://[Linker Error]Unresolved external 'WSAStringToAddressA' refereced from F:\IMAGE\AP_MONITOR\BROADCAST\MAIN.OBJ 我想可能是函数没有定义的错误,我记得有些API函数是需要在头档中声明的, 然后才可以用,但我不知道怎么做,可否告诉小弟,谢谢!!!! 再有就是出现类型错误,下面我已经将代码贴上来了,可否请您和其他大大 测试一下,看看问题在什么地方,谢谢!!!!!!!!!    void __fastcall TMain_Frm::Button1Click(TObject *Sender) {     int nRet, i;     int nIP_TTL = 1;      // 在本子网中传播。如果要跨路由器,则路由器必须支持IGMP协议     BOOL  bFlag;     DWORD dFlag, cbRet;     int iLen = MAXADDRSTR;     char strDestMulti[MAXADDRSTR] = "224.1.1.1";  // 多址广播地址范围从224到239。     SOCKADDR_IN stSrcAddr, stDestAddr;     SOCKET hSock, hNewSock;     u_short nDestPort = 6666;     WSABUF stWSABuf;     char achInBuf [BUFSIZE];     char achOutBuf[] = "Message number:             ";        nRet = CheckWinsockVersion();  // 检查WinSock版本号        if(nRet)     {         printf ("WSAStartup failed: %d\r\n", nRet);         return;     }        // 将字符串地址转换为套接字地址     /* address string */     /* address family */     /* protocol info structure */     /* socket address string */     /* length of socket structure */     nRet=WSAStringToAddress(strDestMulti,AF_INET,NULL,(LPSOCKADDR)&stDestAddr,&iLen);     if(nRet)     {         //printf ("WSAStringToAddress(%s) failed, Err: %d\n", strDestMulti, WSAGetLastError());         return;     }        // 创建一个多址广播套接字     hSock = WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,(LPWSAPROTOCOL_INFO)NULL, 0,                       WSA_FLAG_OVERLAPPED|WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);        if (hSock == INVALID_SOCKET)     {         //printf ("WSASocket() failed, Err: %d\n", WSAGetLastError());         return;     }     bFlag = TRUE; // 设置套接字为可重用端口地址     nRet = setsockopt(hSock,                /* socket */                       SOL_SOCKET,           /* socket level */                       SO_REUSEADDR,         /* socket option */                       (char *)&bFlag,       /* option value */                       sizeof (bFlag));      /* size of value */     if (nRet == SOCKET_ERROR);         //printf("setsockopt() SO_REUSEADDR failed, Err: %d\n", WSAGetLastError());        // 将套接字绑扎到用户指定端口及默认的接口     stSrcAddr.sin_family = PF_INET;     stSrcAddr.sin_port = htons (nDestPort);     stSrcAddr.sin_addr.s_addr = INADDR_ANY;     nRet = bind (hSock, (struct sockaddr FAR *)&stSrcAddr, sizeof(struct sockaddr));     if (nRet == SOCKET_ERROR);//printf ("bind failed, Err: %d\n", WSAGetLastError());        // 设置多址广播数据报传播范围(TTL)     nRet = WSAIoctl (hSock,               /* socket */                      SIO_MULTICAST_SCOPE, /* IP Time-To-Live */                      &nIP_TTL,            /* input */                      sizeof (nIP_TTL),    /* size */                      NULL,                /* output */                      0,                   /* size */                      &cbRet,              /* bytes returned */                      NULL,                /* overlapped */                      NULL);               /* completion routine */     if (nRet);//printf ("WSAIoctl(SIO_MULTICAST_SCOPE) failed, Err: %d\n", WSAGetLastError());        // 允许内部回送(LOOPBACK)。Windows 95不支持改选项     bFlag = TRUE;     nRet = WSAIoctl(hSock,                        /* socket */                     SIO_MULTIPOINT_LOOPBACK,      /* LoopBack on or off */                     &bFlag,                       /* input */                     sizeof (bFlag),               /* size */                     NULL,                         /* output */                     0,                            /* size */                     &cbRet,                       /* bytes returned */                     NULL,                         /* overlapped */                     NULL);                        /* completion routine */     if (nRet);//printf("WSAIoctl(SIO_MULTIPOINT_LOOPBACK) failed, Err: %d\n", WSAGetLastError());        stDestAddr.sin_family = PF_INET;     nRet = WSAHtons(hSock,                   /* socket */                     nDestPort,               /* host order value */                     &(stDestAddr.sin_port)); /* network order value */     if (nRet == SOCKET_ERROR);//printf("WSAHtons() failed, Err: %d\n", WSAGetLastError());        // 加入到指定多址广播组,指定为既作发送者又作接收者     // 在IP multicast中,返回的套接字描述符和输入的套接字描述符相同。     hNewSock = WSAJoinLeaf (hSock,                  /* socket */                             (PSOCKADDR)&stDestAddr, /* multicast address */                             sizeof (stDestAddr),    /* length of addr struct */                             NULL,                   /* caller data buffer */                             NULL,                   /* callee data buffer */                             NULL,                   /* socket QOS setting */                             NULL,                   /* socket group QOS */                             JL_BOTH);               /* do both: send *and* receive */        if (hNewSock == INVALID_SOCKET);//printf ("WSAJoinLeaf() failed, Err: %d\n", WSAGetLastError());        // 在循环中发送/接收数据。测试时可以改为无限循环     for (i=0;i
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-14 09:05:39 IP:218.17.xxx.xxx 未訂閱
RaynorPao大大,您提供的这个资料我看过了,但我在实做的时候,遇到 问题了,编译不过去,您能帮忙看看吗?万分感谢!!!!!! 各位大大,有谁测试过RaynorPao大大提供的参考资料?如果有人测试 通过了,可否指点一下小弟,将您编译成功的代码贴上来,或者有什么 其他方法可以解决小弟提出的问题,谢谢!!!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-14 10:38:06 IP:203.73.xxx.xxx 未訂閱
引言: RaynorPao大大,您提供的这个资料我看过了,但我在实做的时候,遇到 问题了,编译不过去,您能帮忙看看吗?万分感谢!!!!!! 各位大大,有谁测试过RaynorPao大大提供的参考资料?如果有人测试 通过了,可否指点一下小弟,将您编译成功的代码贴上来,或者有什么 其他方法可以解决小弟提出的问题,谢谢!!!
I_Love_You 你好:
(1)不好意思,小弟我最近比較忙,因此只能先幫你解決 compiler 的問題,剩
   下的部分,你先自己試試看吧
( >
#>    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-15 11:46:49 IP:218.17.xxx.xxx 未訂閱
非常感谢RaynorPao您的再次回应,谢谢!!!! 我有个问题先问您一下,您是怎么知道需要加入下面的档案才可以呢? C:\Program Files\Borland\CBuilder6\Lib\Psdk\WS2_32.lib 我想知道的是您是根据什么才会想到要加入这样的档案,因为一般人 很难想到要加这样的档案,所以恳请您可否指点一下小弟您究竟是根据 什么理由想到这个的呢?我主要是想学一下您的这个方法,下回我再遇到 类似问题的时候,我可以通过您介绍的方法也可以添加类似这样的档案, 把问题解决,望指点指点,谢谢!!!!! 回到程式,您提供的资料上有说:“多址广播(multicast,也译作多点 传送或组播)是一种一对多的传输方式,传输发起者通过一次传输就将 信息传送到一组接收者,与单点传送(unicast)和广播(broadcast) 相对应。”也就是Multicast还不是真正的broadcast,即255.255.255.255 的形式,我刚才也测试过,按照他提供的IP地址: char strDestMulti[MAXADDRSTR]="224.1.1.1"; // 多址广播地址范围从224到239。 根据抓包的程式抓下来看了,他并没有真正实现从224到239的广播,不晓得 他在搞什么鬼。 我又试图将IP改为255.255.255.255以后,连包都发送不出去了,也就是不能 简单的将原来的IP改成255.255.255.255就可以实现广播的,而且我觉得 实现broadcast要比Multicast简单才对,唉,还不知道怎么做。 恳请RaynorPao和其他的大大,如果有时间的话可否帮小弟彻底解决一下 要如何来发送255.255.255.255这样的broadcast的广播字串或提供一些 资料给我来解决这个问题,万分感谢,谢谢!!!!!!!!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-15 21:15:59 IP:61.221.xxx.xxx 未訂閱
引言: 非常感谢RaynorPao您的再次回应,谢谢!!!! 我有个问题先问您一下,您是怎么知道需要加入下面的档案才可以呢? C:\Program Files\Borland\CBuilder6\Lib\Psdk\WS2_32.lib 我想知道的是您是根据什么才会想到要加入这样的档案,因为一般人 很难想到要加这样的档案,所以恳请您可否指点一下小弟您究竟是根据 什么理由想到这个的呢?我主要是想学一下您的这个方法,下回我再遇到 类似问题的时候,我可以通过您介绍的方法也可以添加类似这样的档案, 把问题解决,望指点指点,谢谢!!!!! 回到程式,您提供的资料上有说:“多址广播(multicast,也译作多点 传送或组播)是一种一对多的传输方式,传输发起者通过一次传输就将 信息传送到一组接收者,与单点传送(unicast)和广播(broadcast) 相对应。”也就是Multicast还不是真正的broadcast,即255.255.255.255 的形式,我刚才也测试过,按照他提供的IP地址: char strDestMulti[MAXADDRSTR]="224.1.1.1"; // 多址广播地址范围从224到239。 根据抓包的程式抓下来看了,他并没有真正实现从224到239的广播,不晓得 他在搞什么鬼。 我又试图将IP改为255.255.255.255以后,连包都发送不出去了,也就是不能 简单的将原来的IP改成255.255.255.255就可以实现广播的,而且我觉得 实现broadcast要比Multicast简单才对,唉,还不知道怎么做。 恳请RaynorPao和其他的大大,如果有时间的话可否帮小弟彻底解决一下 要如何来发送255.255.255.255这样的broadcast的广播字串或提供一些 资料给我来解决这个问题,万分感谢,谢谢!!!!!!!!
I_Love_You 你好:
(1)小弟我寄給你的 mail 收到了嗎??
( >
// >>>>>>>>>> >
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-16 11:15:40 IP:218.17.xxx.xxx 未訂閱
真是太爽了,万分万分万分的感谢您RaynorPao大大,您提供的利用 IdUDPServer来实现广播正是我想要的那种,而且我也测试过了,可以 正确返回我想要的数据,真是高兴啊! 您发的信我也收到了。 ( “I_Love_You先生,你可以谈一下你碰到问题解决后的感受吗?” “我首先要感谢Delphi K.Top论坛啦,还有各位站长啦” “还要感谢PaynorPao大大的鼎立相助啦” “还要感谢互联网,可以让我认识不同地方的朋友啦” “最后要感谢的是一直支持我,鼓励我,帮助我的各位大大们, 我爱你们,I love you !!!!!!!!!” “谢谢!谢谢!!!” )
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-16 11:52:13 IP:61.221.xxx.xxx 未訂閱
I_Love_You 會員 你的機制 是要確認 程式在lan下防止相同程式在Lan下run把 255.255.255.255这样的广播 這樣的方式 其實很可能會造成 某些網路 封包問題 因為 255.255.255.255也是 路由器 這和 網路主機 子網遮罩 相關內定值 所謂 多址廣撥 就是一個 一般運作 溝通閘道 一個防堵相同ap運作閘道 就像 127.0.0.1 為windows系統硬體運作內定值 硬要使用也是可以的 不過不好改 使用 255.255.255.255 應該是不論 pc的ip多少 都先以255的ip先廣撥 再執行嗎 網路的 確認機制 如果遇到防火牆 一樣無法通過 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-17 12:35:51 IP:218.17.xxx.xxx 未訂閱
非常感谢jackkcg大大您的建议,谢谢!!! 我先把我的情况简单的介绍一下,我写的程式是用在小型的局域网内, 大概最多的时候会有二三十的AP,而这些AP的连接可能是通过有线的, 或者不线的,中间也有可能经过路由器等设备。因为这些AP需要收到 固定的封包内容才会有反应,即返回他的基本信息,如:MAC Address, IP Address,AP Name等信息,所以当我的程式一开始运行的时候,就需要 发送固定格式的broadcast封包,来获得现在这个局域网内都有哪些AP在 正常的运行(如果是正常运行,会返回我上面说的信息),然后将这些 AP的情况放到列表中,如果需要对具体的某个AP操作的时候,就会针对这个 AP进行单独操作,不会再发broadcast了。大致情况就是这样了。 我用broadcast主要就是获得在这个局域网内,都有哪些AP在正常的运行, 并获得他的基本情况。 肯请jackkcg大大和其他大大们看了上面的情况后,帮小弟我分析分析看看, 在这种情况下发送broadcast是否可行呢?是否会出现什么样的问题? 或者写这样的程式都需要注意些什么?盼望指点指点,万分感谢!!! 谢谢!!!!!
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-19 20:16:08 IP:61.64.xxx.xxx 未訂閱
I_Love_You 可行性 你可以試看看 東石的虛擬光碟VD-Virtual Drive 7.1 他就是255.255.255.255 ok 我說的是 當然可行 不過它也會有環境造成的變數 只有啟動時他才255.255.255.255 執行約2秒之後即 常駐偵測 你的程式也許不是虛擬光碟 不過 確認機制 差不多 1 小型區網 2 使用網路確認 3 多ip位置溝通 I_Love_You 我想問一下 這個還記的嗎? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22599 如果不方便 寫心得 沒有關係 在KTOP找個 能勝任的位置 看要為大家服務也可以 快快喔 哈哈 我可市出名的 釘人喔 我不喜歡輸 也不喜歡被晃點 不過是可以溝通的 哈哈 (台灣 霹靂火) 有能者 應該多多幫助別人 這樣會有意想不到的快速成長 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-06 2:51:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!