下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。( a  C: G9 N) h) V$ O
想编一个程序,实现类似于网通拨号器的功能
7 x' N# t8 o7 \& D9 |5 K/ r7 B# M9 v3 k+ Q* n
10:51:59 Message: 正在打开端口,请稍候...' ^) P" t* V: w7 O' v
10:51:59 Message: 端口已经打开
+ ~. b. s, p2 ^  c' }10:51:59 Message: 正在连接网络设备,请稍候...0 |# Q% v# S- n
10:51:59 Message: 网络设备连接成功9 M& M3 a# U; n, `3 g' G6 c8 t8 ]
10:51:59 Message: 网络设备已经准备就绪
  C: |" k$ H$ f4 a* V# t' g0 n10:51:59 Message: 正在验证用户帐号和口令,请稍候...6 P! J8 A: l! ^! p& H
10:52:00 Message: 正在接收验证/授权过程通知消息
! m3 P% e; x* e+ t10:52:00 Message: 正在与服务器进行数据交互,请稍候...% u: l. p1 a. w( `6 f9 A4 W
10:52:00 Message: 正在接收验证/授权过程通知消息3 ~% X- E: o8 N$ K
10:52:00 Message: 交互过程结束
# M' [0 c+ }$ I7 q% ~. ?10:52:00 Message: 正在接收验证/授权过程通知消息8 H* R$ C- Y( i
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
1 r* G$ P5 z! r, {; y10:52:02 Message: PPPoE连接建立成功
0 X* j' G- S; @5 l10:52:02 Message: IP -> 192.168.0.2: U$ h3 W' {  b& l0 j: G
10:52:02 Message: IP -> 218.109.100.707 A' x0 }* L( f8 i
10:52:02 Message: IP -> 218.109.98.169+ z1 G- E$ t2 q, y1 o

* d9 b# q, \1 {+ j3 q7 c2 T2 v给一个实例的代码好吗?
2 K1 R: B: F. O' F: Z3 I( c  B我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。, u1 s. G+ {) p! B. \* i
我没有编写过ppp之类的软件,没法给你一个实例。
9 ]6 M  |3 v  \7 t& q1 r  r我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。% [, G& @$ e2 Z" L
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
3 L$ a2 y& e6 P8 E! Q9 {$ V" I

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
5 |0 S. {6 W7 X1 T 我没有编写过ppp之类的软件,没法给你一个实例。5 x0 U! B% ?$ E; U9 s2 m
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。' I  i. V' C8 o" i4 ^1 |
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API2 I8 t+ Q% K- K8 Y: J' c% T

, H, w- ~9 w) i" |" [
! G$ E1 {5 m' h- _很可惜,真的太可惜了。% S/ P$ n1 _- f
标准的拨号只要调用几个简单的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
% x; P, n! |- H5 E" @9 s/ h' R. N: E3 T" a. o5 O7 `4 B( x5 l$ v
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息. s, }/ Q& _3 r0 E' Y

4 D! l7 g" t4 \$ m5 ehttp://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
' X3 ?) ?6 B0 R- d; q有一个RasDial拨号函数的定义如下:
) M2 R- \: g; \- ]' ZDWORD RasDial(
3 y6 J7 z: q$ z* J: e7 s9 K& mLPRASDIALEXTENSIONS dialExtensions, 6 _1 r/ z3 Q( x1 Z+ ^
LPTSTR phoneBookPath ,
, Q, X4 T  ]  [, x; F  o/ s1 OLPRASDIALPARAMS rasDialParam ,   S4 i" j4 H7 \$ f/ |# b5 p
DWORD NotifierType, * J0 h8 A" z/ f! M( l3 }
LPVOID notifier, % e0 f0 q' a/ c/ K( u% D$ S
LPHRASCONN pRasConn );4 p  X9 a- L, @- L

6 j, e& T) z* t  i4 q6 N我的MSDN的解说如下:2 c) G( ?) I, T( l2 S
Parameters
# M2 h, Z1 k$ m3 h" Y- adialExtensions , k% \: R3 \1 [* r9 h1 T4 j
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options. 7 D4 H9 D0 }; H/ i4 F
phoneBookPath
6 ?  p, i4 d) d/ q- ^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. 7 Z0 O& f; @) E$ Q( [9 C
rasDialParam
$ N# l7 z- Y. x( nPointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.   q- J0 ?5 P% y# q' ]
The caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. : {) E8 E! A% {( W. @/ p* i
  t+ y+ C% N- P& m7 P/ \& q
NotifierType 3 E- v( `$ `; v. p& m8 D$ u# h
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: - ]6 Z# U* A; T0 Z# U: @9 y
Value Description
: {7 g1 M$ }' S8 u2 P/ F# _6 I, ?0xFFFFFFFF
3 O; @" G3 r( H4 ~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 ^" [" L5 T  e6 N) p8 j
The progress notification message uses the WM_RASDIALEVENT message code. 5 F7 l& E: I! X/ k9 O8 T

$ `; [- h' T+ q' r; a( N  ?7 N, \4 m# A/ B1 Y7 R

6 m' E3 B' [6 S% C( Y+ v$ @) K9 t& i4 b. F# I5 n
notifier 7 F0 t& R" R/ O' 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.
$ x8 E% E; @! k- FIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
! [0 z1 M2 ^  ~$ l; r5 z7 X9 s; ]  k* K9 f. O* k2 q
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: % o" i. }4 e, H7 Z# X. X

, h4 _, I7 t$ H2 C/ r! hThe connection is established. In other words, the RAS connection state is RASCS_Connected. + S$ K6 o3 |% V: ^
The connection fails. In other words, dwError is nonzero.
1 Z5 ]* R% e5 I8 w. M/ WRasHangUp is called on the connection. ( T6 @1 x& H" }; j) p: j. ]
The callback notifications are made in the context of a thread captured during the initial call to RasDial. - a, F! b1 \% Z& @# X. v

7 y+ b* v! S) v$ J0 ipRasConn
+ ^: W" h' f7 C$ b) b4 w" rPointer 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. ) q: ~; K9 A/ M5 ^* S& H
Return Values
+ t! ~$ M& K& Z) iZero 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. " z8 ]  u. R- z# n/ N
! W4 a' M% d" w( @7 K! E. A, ?
Include Raserror.h for definitions of the RAS error codes.
9 M7 |( c: ?# \: Q5 T! s* R, O2 m4 U! u3 H
Remarks8 {3 w/ @1 N" }+ Y. a
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.) Q  T8 L' _. W; f$ ]" N

  J* r1 F' k& P, XRasDial 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." H5 X: R* H; j# j

+ V! d% z$ P% t  mErrors that occur after the immediate return can be detected by RasGetConnectStatus. Data is available until an application calls RasHangUp to hang up the connection.
* |6 o9 O5 V1 O
) ?' Z, O  ?$ Z8 A, t- l3 p! `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.
3 |5 G& e2 n* p. g) A6 g( x, u  B5 K+ V. u9 w
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.
' x& {9 g. K1 d4 m
' {% u& N: L7 O8 H) f/ F3 sThe 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.
: a+ h9 |6 q  N( o. q- o) X; S; H' R( _/ Y( ?
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号) g+ L2 T9 t4 @, T& M# M* D
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);: A$ p# l$ H- k  _- L
第五个参数是个回调函数,一般都定义如下:
4 |, b0 P+ z5 f; m! bvoid WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
  \2 e" f7 G5 U{0 ^: Y  u  a2 ^* s6 b
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
7 Y! d, ]: `) F) x; c4 q        , h& e& ]* X  K$ o, X
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);5 y0 s8 P' @8 g
}. U. n7 s. X* G, ]
这个回调函数将会把拨号的状态POST到各个窗口句柄。
" q' W+ ]& p" c1 w* O4 ~' ~
# s& B! v# N7 @! ^' O

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃- o  X6 z8 t7 b# A
6 ?9 f3 W; K2 X8 Q4 n9 i7 s

* Y  r2 X- V; k: z8 X. b在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出! U: a8 R1 e% v4 j; G
10:51:59 Message: 正在打开端口,请稍候...8 m$ e' d9 y# ~
10:51:59 Message: 端口已经打开: o1 R, H" s7 y+ K! p
10:51:59 Message: 正在连接网络设备,请稍候...3 q) J" C$ Q/ {3 S
10:51:59 Message: 网络设备连接成功" P  E* [- W5 w" N
10:51:59 Message: 网络设备已经准备就绪
/ N( E7 V: e( b2 T+ x' w# Y# U, |10:51:59 Message: 正在验证用户帐号和口令,请稍候...
3 \9 z4 L1 j& v3 _10:52:00 Message: 正在接收验证/授权过程通知消息  h- D2 z, c+ G0 z" s# x  f
10:52:00 Message: 正在与服务器进行数据交互,请稍候...
  v6 ], x# _7 o0 L* M0 X8 ~10:52:00 Message: 正在接收验证/授权过程通知消息
% n- t1 ?: F! B$ o* V10:52:00 Message: 交互过程结束: y& o  P7 }/ d$ a
10:52:00 Message: 正在接收验证/授权过程通知消息- W3 x4 n( z+ o1 k3 Y3 @
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
8 n, R3 ^9 n' K1 Q# H10:52:02 Message: PPPoE连接建立成功5 l: C' V; i( S) c) @% M
10:52:02 Message: IP -> 192.168.0.2
! x* H) `5 N# m7 e10:52:02 Message: IP -> 218.109.100.70: ^) |) c+ \8 j2 X. V
10:52:02 Message: IP -> 218.109.98.1696 d% E9 Y0 n# l. m$ o$ b

* A6 o& G" G9 {5 R

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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