下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 2774|回复: 8
打印 上一主题 下一主题

[求助]HZZH进,有关于网络低层控制的问题请教

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。$ q5 y" _# Q% r3 o9 u, E' I( x
想编一个程序,实现类似于网通拨号器的功能
7 e  x% l9 Q) o  P: ^7 R* T5 b
! B! {! `9 S" {5 f10:51:59 Message: 正在打开端口,请稍候...8 Z8 C6 _% x: H( G
10:51:59 Message: 端口已经打开
1 _; ~" q% I/ b8 P0 P10:51:59 Message: 正在连接网络设备,请稍候...
8 Z9 w; H9 A0 _1 q10:51:59 Message: 网络设备连接成功- Z0 g$ `% s, q6 a  _# C( |" j+ g
10:51:59 Message: 网络设备已经准备就绪2 H3 i- U- k9 R, O% @9 Z/ M( x" `7 u7 ~
10:51:59 Message: 正在验证用户帐号和口令,请稍候...! p5 `. g3 M' R  Z: L
10:52:00 Message: 正在接收验证/授权过程通知消息
; Y2 M. e  {# |4 J* q# J+ @10:52:00 Message: 正在与服务器进行数据交互,请稍候...3 J2 V; }0 v; b/ K! p
10:52:00 Message: 正在接收验证/授权过程通知消息
0 p6 W7 X. @- l: F) y/ U10:52:00 Message: 交互过程结束4 Q! I4 _% r5 [6 t2 o0 s- E& H8 b1 b8 y
10:52:00 Message: 正在接收验证/授权过程通知消息2 ~  G- c# O1 K4 K4 y' s$ K
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
) _6 N7 A+ K: [% w- o* p10:52:02 Message: PPPoE连接建立成功
9 ?! M- m- I' `' j9 v3 b6 H/ Q10:52:02 Message: IP -> 192.168.0.2
; k# z0 _$ F$ i: _. ]) I/ a10:52:02 Message: IP -> 218.109.100.70
! Y$ L. |; S1 M" q% i7 Y) A9 C3 w10:52:02 Message: IP -> 218.109.98.1693 W5 [+ v* B0 S
: W! q* C5 ?# m# i* F9 j
给一个实例的代码好吗?
/ C7 M  m9 w' i* b; M3 v6 O$ j& W2 A我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。
) I8 h' R+ ?7 v( Q% k我没有编写过ppp之类的软件,没法给你一个实例。
0 @! ?0 f  N" E我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。5 j8 Y6 V  X5 Z& g& b+ _
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API" y5 {- ]; W$ g

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:4 G0 \% `: f, r
我没有编写过ppp之类的软件,没法给你一个实例。
$ q( V9 j7 c$ X' V7 ^7 l5 a 我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。  a" f7 {0 z8 i/ K% \
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API3 u  ~! E) [" G& S
, W  `6 S) {- H7 [1 [6 g

6 Y8 ~, S; Y2 |5 ~) q很可惜,真的太可惜了。( |. v3 w% l1 w  G" q
标准的拨号只要调用几个简单的API就可以做到了,但就像系统自带的RASPHONE那个程序一样,只是简单地提供拨号过程前后的状态。我想要的是介入拨号过程,唉,我自己再找找资料吧。只是网上这方面的中文资料太冷门了。我找了一个上午也没有找到。

该用户从未签到

4
 楼主| 发表于 2003-9-21 21:51:00 | 只看该作者
Thank you all the same!

该用户从未签到

5
发表于 2003-9-22 18:51:00 | 只看该作者
试试这个,CRasMonitor v1.2, A freeware MFC class to monitor RAS (aka Dial-Up Networking) connections$ {) m% m! w# s. b! @; d) H
8 k' Y/ h  l" N' o( e* X
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息5 {7 k* M. J2 _3 N5 G
4 ?: Y8 w! Y0 I* j9 o
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
# g9 K) h) h2 w+ s( X有一个RasDial拨号函数的定义如下:9 S/ M) L& }% v
DWORD RasDial(
% S) S9 v3 G- ~LPRASDIALEXTENSIONS dialExtensions, 6 ?* }* H& Y  W/ W: `! Q% p% o% z5 A
LPTSTR phoneBookPath , # V: j& l% }# f! I3 A9 D
LPRASDIALPARAMS rasDialParam , 9 p% W+ j6 V3 G. s, ?/ t& A
DWORD NotifierType,
& Y2 l8 X3 Y6 m( l+ L. }" eLPVOID notifier,
: ^1 v* M: I$ A4 [5 G, |LPHRASCONN pRasConn );
: t, O  g  e' M' [4 D9 ^6 ]: _
我的MSDN的解说如下:1 B# \0 V; _/ C
Parameters
, C$ N4 s& d# v) ~) U' tdialExtensions ; G7 _8 @, p" @5 P. d
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
% S. U. x. d8 _; v/ bphoneBookPath / Y! d& e) S% C# M8 `+ @
This parameter is ignored and should be set to NULL. Dial-up networking stores phone-book entries in the registry rather than in a phone-book file. 3 a" a: O: H# h* @% R
rasDialParam
& o& n& W9 V* }* _$ Q; F' w- oPointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection. / A0 C8 H( j/ d$ F1 m) F
The caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. % [( w4 i7 Y! R% f. \4 [+ a$ }

, K% Y1 L! X7 o9 wNotifierType
1 b8 a' l4 Z$ N( c9 e  QSpecifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value: # v9 r) y$ @4 Z) o: X- S5 K
Value Description 9 h5 c. u  h$ l' H$ K. M: Z" y
0xFFFFFFFF7 U) J& V' K* Z+ T
0xFFFFFFFF The notifier parameter is a handle to a window to receive progress notification messages. In a progress notification message, wParam indicates the connection state  (rasconnstate) which the RAS connection is about to enter, while  lParam indicates whether or not an error occurred.  7 S1 L4 J4 C) ^$ b( S* M
The progress notification message uses the WM_RASDIALEVENT message code. 7 V0 f1 [- n2 {8 u

2 {* ]; @9 y+ L- v* V4 o: z
! r. Q3 E- p2 ?2 y4 h
/ Q% {# L4 `9 n7 [" O& K
3 M8 l, U9 A: }" m6 Nnotifier . j4 \; k/ l- l4 ^' t. q3 f
Pointer to a window handle to receive RasDial event notifications. If this parameter is not NULL, RasDial sends the window a message for each RasDial event. Additionally, the RasDial call operates asynchronously: RasDial returns immediately, before the connection is established, and uses the window to communicate its progress.
' M0 [6 e( N: |$ DIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed. 8 [% b4 L0 C0 U! W) t; _
' H* L. d5 O* l4 G2 U3 H8 Z
If notifier is not NULL, notifications to the window can occur at any time after the initial call to RasDial. Notifications end when one of the following events occurs:
0 H- H& g: @6 a# R" y- d' ~' S2 \2 m$ V$ \0 x' k  v' l! @- [
The connection is established. In other words, the RAS connection state is RASCS_Connected.
8 T5 ^2 V5 X- N2 S( GThe connection fails. In other words, dwError is nonzero.   U0 G5 {* I: n
RasHangUp is called on the connection. ; o& ^" l- S4 [% I* C0 Z2 C5 V
The callback notifications are made in the context of a thread captured during the initial call to RasDial.
; @+ M/ ]5 N; K/ N" ]  k
7 x) D) P) m, y2 hpRasConn
" _4 W8 [! o1 @  b' }2 h* V. ZPointer to a variable of type HRASCONN. You must set the HRASCONN variable to NULL before calling RasDial. If RasDial succeeds, it stores a handle to the RAS connection into pRasConn.
2 L2 \" ^" B/ D# |" z2 `# B) G; rReturn Values* Y, w" n# H2 P) r8 r- d
Zero indicates success. In addition, the function stores a handle to the RAS connection into the variable pointed to by pRasConn. A nonzero error value, either from the set listed in the RAS header file or ERROR_NOT_ENOUGH_MEMORY, indicates failure.
1 W& i+ M  \4 J7 S+ p5 h5 |( M7 R  Y  ^3 _
Include Raserror.h for definitions of the RAS error codes.
+ q8 w0 o" c& j; T! |3 Y9 L8 F% R5 h- O$ j( D
Remarks
. [9 `4 d9 y2 vThe szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.( m% ?: u; m: B5 C4 \

$ G! Q7 U9 _: s2 C6 Y* p- YRasDial will not automatically display the logon dialog box. This is currently done through the Remote Networking application. Applications are responsible for getting the information from the user.7 Y" W* d! U& {/ _

7 i2 W0 S9 j4 y, R( Z9 V' LErrors that occur after the immediate return can be detected by RasGetConnectStatus. Data is available until an application calls RasHangUp to hang up the connection.
7 ?9 w, Q9 Z" y9 Y+ o; n0 C
8 R" R" f* y. V9 `% {% dAn application must eventually call RasHangUp whenever a non-NULL connection handle is stored into pRasConn. This applies even if RasDial returns a nonzero (error) value. 2 G- N' t! h! M
' o& y5 d' Z1 d% n3 D
An application can safely call RasHangUp from a RasDial notifier handler. If this is done, however, the hangup does not occur until the routine returns.
! Z$ G6 Y: T4 B! W* l7 o2 Z7 K* Q9 X3 I" y* B2 Y2 T& o
The window handle-based notification only works if the underlying configuration supports the PostMessage function. PostMessage is exposed through the msgque component, which is a part of the GWES module. Event notification through a window handle can only work if GWES is part of the underlying configuration. 0 D- ?, W6 I! d5 N1 k# a) N
2 W5 Q) f. \0 D' ]+ A+ |) ?
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号) O4 T7 R+ |" Y) M+ K
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);( A: Q3 d9 F) D8 r; r
第五个参数是个回调函数,一般都定义如下:' I2 P# \& r4 v5 p/ E. U5 {! r
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)% \: n4 ]9 x5 x; {% B8 W! u
{
. J  x7 P( J; Y* G% h9 n3 b; \( m        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;. _$ ]( E- J+ K+ }( ~
       
+ ~7 l- R  }$ o7 g) N- D        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
' ?+ M! U( e. R/ g7 B! m; a+ i}
1 H5 e) R0 {- J+ w4 L# N这个回调函数将会把拨号的状态POST到各个窗口句柄。9 i; |' \2 p, G  A% U0 Z7 U' }8 X5 h

- d5 {* X8 \5 @9 T! u. h, S  V

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃! Y9 Q" x7 D+ g
( A0 m' G. j4 H3 D9 ~

% V% _  E8 x  E* |8 V$ P在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出/ Q' K' _6 B. S0 w& b& U9 g
10:51:59 Message: 正在打开端口,请稍候...  J; C% ?6 H5 J- o
10:51:59 Message: 端口已经打开
3 f% D9 U$ e3 O: v( N10:51:59 Message: 正在连接网络设备,请稍候...* ?" i$ _2 j& C% |, z# v. a
10:51:59 Message: 网络设备连接成功
- g8 R6 ~" f& A1 Y7 M6 q10:51:59 Message: 网络设备已经准备就绪
: H' K6 N9 o3 D0 G) q10:51:59 Message: 正在验证用户帐号和口令,请稍候...
9 t% T5 l' v3 i, c, M10:52:00 Message: 正在接收验证/授权过程通知消息6 q1 w: o( t7 k
10:52:00 Message: 正在与服务器进行数据交互,请稍候...1 `" m; ^! y5 k
10:52:00 Message: 正在接收验证/授权过程通知消息( m! w5 ~) X; i
10:52:00 Message: 交互过程结束
& K6 f0 O' @/ P. l10:52:00 Message: 正在接收验证/授权过程通知消息
' y  ?" P) D) x0 J' n4 f: ^; H10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
8 j+ v" Q& V" y/ {# z10:52:02 Message: PPPoE连接建立成功
4 ?4 p& G, A2 ~2 Q- K; Z10:52:02 Message: IP -> 192.168.0.2: O! T( U3 A8 q
10:52:02 Message: IP -> 218.109.100.70
2 i; Z( {  O$ q* U10:52:02 Message: IP -> 218.109.98.169, u2 @7 q+ G+ [7 t! U

5 i' m' O! _' N( t9 f

该用户从未签到

8
 楼主| 发表于 2003-11-13 14:55:00 | 只看该作者
很少接触回调函数。好像回调函数要求使用static型的,可是static型的函数用着很麻烦,还不如把消息post到主窗口再进行分流处理。

该用户从未签到

9
发表于 2003-11-22 09:11:00 | 只看该作者
ok

本版积分规则

关闭

下沙大学生网推荐上一条 /1 下一条

快速回复 返回顶部 返回列表