下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。8 O7 m3 H# S$ b6 m
想编一个程序,实现类似于网通拨号器的功能
/ V; f, a- U; i  l# T# W, ~" K) I5 \/ t; i4 W# N% r  S
10:51:59 Message: 正在打开端口,请稍候...
7 T0 O% r! }1 Z# i$ P3 Z* ]10:51:59 Message: 端口已经打开& `' u- u- A' h4 z0 O) c" p
10:51:59 Message: 正在连接网络设备,请稍候...: u2 n3 u3 [  }* `* Y' S; `" L, o
10:51:59 Message: 网络设备连接成功: [) h; v. O! A  D
10:51:59 Message: 网络设备已经准备就绪
& {5 X( A  N5 d* o) F10:51:59 Message: 正在验证用户帐号和口令,请稍候...; L1 C5 r; `( W' |- ~# R$ A  Y* F( G
10:52:00 Message: 正在接收验证/授权过程通知消息
  N6 F) a1 W3 G# O0 q* p10:52:00 Message: 正在与服务器进行数据交互,请稍候...4 r, B- U% i) l2 M/ L. g. ^
10:52:00 Message: 正在接收验证/授权过程通知消息
! b/ f; P- Q8 u  C10:52:00 Message: 交互过程结束; Y4 u6 t; v; B1 c) v, a# ~3 [8 d
10:52:00 Message: 正在接收验证/授权过程通知消息
+ c0 B, B" s* E8 G10:52:00 Message: 用户帐号/口令验证通过,正在建立连接5 G# t7 `2 a- K8 D3 a: K: T# Q
10:52:02 Message: PPPoE连接建立成功  m/ Q6 ~( e9 b9 k4 Y$ z# j. V8 Y
10:52:02 Message: IP -> 192.168.0.2! N6 F) m; a, p
10:52:02 Message: IP -> 218.109.100.70
( |6 y  y9 X7 {; Y) s/ c+ v( R( `' f" g10:52:02 Message: IP -> 218.109.98.1693 c% H9 _! p0 D# k2 W0 W
) `# H7 M, `5 m  V. t
给一个实例的代码好吗?
/ ?0 }. E7 ^$ P我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。0 w- w( O. {7 L) ^
我没有编写过ppp之类的软件,没法给你一个实例。0 P. `8 T$ j4 L( }' E3 {% C9 k
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。& d8 Z: J% H, P5 ]
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
! m4 Q  `4 V, ^( t' ^+ x

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
+ f1 L* [- t3 x" Q8 B- ~. Q 我没有编写过ppp之类的软件,没法给你一个实例。) _2 F9 {* h: U( r
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。* H: L1 r) Z9 m) |' j" V& b
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
. ?% i& G; v% U0 B. O: q
1 y) W, ?/ C; n/ f5 O( e- i. S1 x

, \* f* Y8 N( t; i. C很可惜,真的太可惜了。
6 q. h7 M8 b. G: Q4 S标准的拨号只要调用几个简单的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
/ \- c* L: q. }& h, o6 \, \  l
! V" g, P- ~  k2 d$ G是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息8 Q& @: A% N0 u" z6 ?+ I* m

) u' P' p- k) b5 {% X8 Q7 Vhttp://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
, ?+ }5 Q4 K. \有一个RasDial拨号函数的定义如下:9 u: l+ c+ L. m7 i( e
DWORD RasDial(, J! S; ?% u9 z/ J2 S( Z
LPRASDIALEXTENSIONS dialExtensions, 4 m8 u+ {4 t9 |/ Q" `
LPTSTR phoneBookPath , ! C2 G0 P; ?- J5 B( i( j
LPRASDIALPARAMS rasDialParam ,
% r6 @7 F( K: sDWORD NotifierType, $ J: T& S+ p" S4 B& b
LPVOID notifier, ; `3 c, t: h1 `1 i5 u
LPHRASCONN pRasConn );3 g& \: c! q+ w# J" p  @
; X% H% r% }* G' _- @
我的MSDN的解说如下:) }; S, |8 Y& T5 G) W5 H" }
Parameters; Q* X  {. Y5 c
dialExtensions . h! a' I4 L! R
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options. + ^5 ~8 [' T/ J* s0 G* K  N
phoneBookPath 1 R) Z, `4 q/ d. j- t
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. & [) D  [5 |3 f  [
rasDialParam / z6 G- M- G" m" V( M- H
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
3 r0 D0 }: d; Q& NThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. 1 }% P4 z! ]5 e. \$ i0 ~

! c/ C5 o6 G3 }# D$ `3 z# LNotifierType 4 j$ {, e& r5 t4 _/ h6 D8 Q
Specifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value: % i' L- [5 v  ]$ P
Value Description
+ `; t$ F2 B) k2 v! x0 e: V' A0xFFFFFFFF- l* b! O6 l, W5 Q3 I% j
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.  1 m& q  H* ]: ~( D) Q/ B
The progress notification message uses the WM_RASDIALEVENT message code.
: a5 V& }" X+ o' T7 d
9 n% U8 Y$ N' q( M, a: i7 \2 D2 `, R3 c) n5 A- s

6 l/ b+ S( [' a' [" Q
1 G  r( i, f# F1 t; wnotifier ( m8 x+ q( J3 Y/ r! W
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.
& A+ M0 p+ e  ?2 T1 v: @If notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed. 3 ^: p4 e7 @+ p- m. G6 p

% B9 Q3 V( s) h: g5 w; o- pIf 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: 4 v" p- U* Q( L4 s) H4 n9 r; [5 [0 j: a; y

2 A) }0 b5 e. D/ w7 }The connection is established. In other words, the RAS connection state is RASCS_Connected. # ^( w/ M# p; B2 w+ D- M- w$ T- k
The connection fails. In other words, dwError is nonzero. ; g  L- {6 p5 U+ t+ B) r
RasHangUp is called on the connection. 2 Y/ n  L8 a8 b" ^4 d
The callback notifications are made in the context of a thread captured during the initial call to RasDial.
# O4 B" B" m# `/ [. L% s% W, W$ ~' ^2 t9 I: N& H+ d' A* n
pRasConn
: X5 r# F/ T2 j, f; d6 w! f! [Pointer 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. ) X% g; v  u* N1 x$ Q8 b; o
Return Values
" w$ n  B0 ?6 d  H) s1 I0 hZero 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.
% e/ C& |* L, U% O* k5 H
$ L4 ?' j6 O7 c. q5 b+ {Include Raserror.h for definitions of the RAS error codes.
2 T1 f6 ^' a2 T$ N' N1 V! ?# J. q: K4 H( V5 B
Remarks
& D# Z2 K( S: ~3 n7 ?The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.
3 S" |- _& ^$ U4 x! Y8 J3 V1 z1 X( V4 H
RasDial 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.
& e. ^" Q; C4 l0 ?5 j% m
/ j6 D( w; R- W) d* \Errors that occur after the immediate return can be detected by RasGetConnectStatus. Data is available until an application calls RasHangUp to hang up the connection. ' }' ]4 u# U" w2 ]8 a! |# Y
% w* D4 k$ K1 ?; O( q
An 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.
6 L# D2 N7 U0 v; e& L" x1 O2 ]) O6 L- J: c$ ^  C% G7 S
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.
) m  ]' `0 @/ u* q* p$ g) _# L5 S' L
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. : M' `' N. a# Z" A. Z$ l  e, G! g% u
% n; x& x" N. r$ b8 c6 J4 S' G
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号
7 V( I. e* C; uDWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);
+ u, J1 d$ P4 |/ z第五个参数是个回调函数,一般都定义如下:
+ z( g) d: R& g/ V5 r: F' `% q4 Yvoid WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
$ v' E: k( N4 n& Z, [# f( O' H{
9 C& o: T, u/ a  j        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;' G, y$ v7 V8 i* p) Z" _5 B
        ( T* f3 l3 }2 `- R
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);% Y2 f; N8 Q# s% `& q; I& O
}
7 u+ ^& [2 D7 L这个回调函数将会把拨号的状态POST到各个窗口句柄。5 w/ P+ H2 `; s1 @2 h( q

- p, p4 |6 Y: D$ Q5 D

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃
2 g6 G# I4 Y% h8 f% `/ \* |
; ~8 ^* T3 q3 e5 _) a
. E% o9 q$ _6 x: W在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出# z8 C0 p* \1 |0 g
10:51:59 Message: 正在打开端口,请稍候...  }0 C3 A) c& z4 e# F+ N
10:51:59 Message: 端口已经打开
0 u% [! g2 F& V5 A6 s+ y10:51:59 Message: 正在连接网络设备,请稍候...2 Q+ |4 b! \% E/ t2 }3 a1 z0 K5 `3 \
10:51:59 Message: 网络设备连接成功
! X5 v; D1 ?7 q7 U10:51:59 Message: 网络设备已经准备就绪- \$ Z- B* f: m  k2 p
10:51:59 Message: 正在验证用户帐号和口令,请稍候...0 _, a9 Q* ^$ k5 I
10:52:00 Message: 正在接收验证/授权过程通知消息
( T2 m2 g- e; d6 A/ E+ p10:52:00 Message: 正在与服务器进行数据交互,请稍候...! k* f, ^% T) b2 I. o/ t  K- t
10:52:00 Message: 正在接收验证/授权过程通知消息
4 V& p: K" t/ z5 F7 ^) l10:52:00 Message: 交互过程结束
2 Q9 k- n) K- Z; l10:52:00 Message: 正在接收验证/授权过程通知消息
9 P6 h& N4 `1 A: _- y4 ]6 n% r! {10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
; y- [; \+ N4 Q. h$ m10:52:02 Message: PPPoE连接建立成功
4 @. u+ e3 k9 v& p, b1 H# f10:52:02 Message: IP -> 192.168.0.2- Y+ Y1 e, ^% g) a: U/ P' n
10:52:02 Message: IP -> 218.109.100.70
7 Z; t9 \- s) ?% z0 h( g10:52:02 Message: IP -> 218.109.98.1690 O6 {1 K" d: r# ]4 Y1 G
6 ^8 \2 D3 ], [7 c/ y  s) p% @

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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