下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。$ [) h; u( _* P, U( c  ]' b
想编一个程序,实现类似于网通拨号器的功能9 A* _# X2 C& `3 U; V  t
. _5 y+ O) l8 J1 \) r* e
10:51:59 Message: 正在打开端口,请稍候...
- C5 f" E& f" S10:51:59 Message: 端口已经打开0 p( T* K3 k  w( @2 w3 p8 e  d
10:51:59 Message: 正在连接网络设备,请稍候.... g, i9 H2 ?2 K, s' c1 T0 a# a
10:51:59 Message: 网络设备连接成功/ r7 z$ D5 N6 }
10:51:59 Message: 网络设备已经准备就绪9 h7 h$ c; B( P. N
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
. }+ Z, I- n5 W/ u10:52:00 Message: 正在接收验证/授权过程通知消息; w$ f6 X: f6 }& P' t
10:52:00 Message: 正在与服务器进行数据交互,请稍候...& t' ~' T4 h/ r) h1 o- A; O
10:52:00 Message: 正在接收验证/授权过程通知消息
% a* c8 [- [5 H0 S6 M( r" b10:52:00 Message: 交互过程结束5 L& A5 c1 P* u2 t
10:52:00 Message: 正在接收验证/授权过程通知消息
5 w6 X# P, o0 @" Y/ M4 D2 @10:52:00 Message: 用户帐号/口令验证通过,正在建立连接/ K: K: n5 f) X& a# m- V5 x5 Z
10:52:02 Message: PPPoE连接建立成功% I4 {4 i8 h" f
10:52:02 Message: IP -> 192.168.0.2* v6 r: b* P! C# R
10:52:02 Message: IP -> 218.109.100.70
4 N/ W* v' n' @% a9 D8 c3 o* P10:52:02 Message: IP -> 218.109.98.169; e+ K; n; m3 h! O2 P" ]

. T9 g( k, Q$ s5 R给一个实例的代码好吗?
2 [; l) {4 e( T# d  P7 S我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。
. l. E+ \, n: y; F  o我没有编写过ppp之类的软件,没法给你一个实例。
) e0 @# s: s  D- p* |7 t我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
/ Z0 o$ V. F6 J# \标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
; ^% v" ?, F* Q. ^5 R% t

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
+ ?8 O9 l& e9 i4 M; R 我没有编写过ppp之类的软件,没法给你一个实例。% f1 t' f- a( u; h
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
0 Z5 |9 ]* G, _" Z) b 标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
: R/ s3 U  h  _/ ~$ A* a

+ z2 R* |5 v5 Z5 O+ _7 u0 L( B
" B% G# e4 \- o很可惜,真的太可惜了。
2 m% b* v. o: }- I/ T( S) }! b* f- U标准的拨号只要调用几个简单的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
' A/ E, r' s/ y, ?; t7 e6 k7 }4 u( Z2 C+ g+ v2 |
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息9 m+ h. {# R, t3 G/ E( g3 z
" {. U0 [( f' x$ A
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
1 N* n( L  _& O1 y4 R" U- q7 j8 c有一个RasDial拨号函数的定义如下:' x* h% y9 @  j; ^/ C7 m6 u
DWORD RasDial() q2 R  d, y# S
LPRASDIALEXTENSIONS dialExtensions,
. I8 Z: L! d+ TLPTSTR phoneBookPath , # A' q' r! j' k: U0 U. R1 I
LPRASDIALPARAMS rasDialParam ,
8 {6 v! q' n  J' q6 ]DWORD NotifierType,
) e- d# w! P3 b: ~- h  ILPVOID notifier, , S) S2 ?, J* R6 I( n+ L) B+ L
LPHRASCONN pRasConn );$ n8 [* V3 S1 j8 x3 h7 i4 i- S
3 f8 `4 l# O$ A: F& U: h' M
我的MSDN的解说如下:
" e1 c% v- k$ g# p: G" ~Parameters
$ X. H) {" e% f% o. XdialExtensions
5 y3 I) O- Y- T, ~This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
  V! Q! c, l4 K' f8 `phoneBookPath
( v( t( i; X1 @' |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. ' }& v& E7 x; C* v% p2 N
rasDialParam
% A! r0 E9 `+ O$ UPointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
: t  n) `* y8 j+ J; wThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. ) \' p) A( V  `3 J) l" r' t

1 ]$ s0 Z! e8 XNotifierType
2 j* b* M  M5 N6 u# C" \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: : J, Y( z( r$ |# c4 [7 ^+ _* u
Value Description
% M4 O' d, ?; }8 g0 P) A% w0xFFFFFFFF, n& |5 [* q9 X" g/ {
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.  
, d! N3 e* I  P7 Y( s4 i8 s/ p The progress notification message uses the WM_RASDIALEVENT message code. 2 x! I9 y% M% N& E4 s  {) b0 w
1 B7 Z" [. R, H2 z% y

% ]% m* H- }* c8 J- W! _% x  Z
& u- |5 i& k* z$ v" ?; R
9 S" T1 V7 U2 [2 h5 S: pnotifier
4 K8 `' p# B& s, T2 L* xPointer 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.
8 O, s# z& Y& @8 aIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
, W% g) U* I' l2 W3 }( r$ J- |, K* G
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 u& I4 s0 i4 t- v& x$ K, u8 I

( e" B& R1 w9 E: _The connection is established. In other words, the RAS connection state is RASCS_Connected. ' z: c9 c  O! a8 y) ?
The connection fails. In other words, dwError is nonzero. 8 f; k; i; r% [1 ~" K5 Y4 n
RasHangUp is called on the connection.
5 X( _0 `; |9 s+ w$ O/ @0 mThe callback notifications are made in the context of a thread captured during the initial call to RasDial.
% a: Q9 |3 d+ x9 I+ _" z
3 A$ {7 Z) U: I" B4 K3 ^pRasConn
4 ?: n1 U2 c, M( G+ fPointer 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. 3 T0 o3 i- n6 I4 ^9 Y
Return Values7 `: r' P( [. F1 C' J5 G
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. 0 b9 x4 R3 a& l/ ^1 L) X

- B% r: Q( n6 P3 TInclude Raserror.h for definitions of the RAS error codes.
* J2 n8 j7 n) T4 B  V3 C( h4 J* J+ \1 ?+ A8 \" l/ R; A
Remarks
9 r, S9 z2 l) q6 W0 Q& EThe szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.
5 |0 m9 ^& p1 m7 v
1 \: W! A# ?$ _4 K7 V' S2 WRasDial 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." K% w0 l" ~& S+ ^, f% a
& l* ^  F% h1 ~8 m$ R
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.
, R* v' z+ Q* Z7 Q8 h: f& R6 Y; D' i2 r4 n' _
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.
# E  C6 X" K5 {3 }3 l' `( ^. U. M# w8 b# ?" r8 }
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.
7 a5 F5 D" z, x2 O# @9 {' y4 w8 }+ \. n
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. , S7 |3 }) i9 W! t( o

; w0 k; H- t  B' B/ D) F看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号
' \' p9 _& D* i" T9 @DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);+ {) z* X6 O- D8 V: r6 a5 C
第五个参数是个回调函数,一般都定义如下:
  v5 f+ {- b% v- L+ o4 Z3 Lvoid WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
' v; k4 v9 J. o: v1 n5 e7 I{
: C5 U! Y' r8 ?7 ]7 |$ W. Q        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
7 |6 C: N) U9 V! O* s" t        6 B7 \0 g/ {. Q9 Y3 c# V9 Z8 J
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
) Z, N' \/ X& Y}
: B9 e4 _7 M" m2 D& ^% i, `+ |. |$ ~这个回调函数将会把拨号的状态POST到各个窗口句柄。0 Y4 V3 b7 |7 s) c  m
  \& ^5 ]0 e1 w

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃  O' Y% A& E- D* b

6 g5 p9 b# W' g5 B& I. P' U0 Z9 b  Z* P! {' x/ ]
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出& |( f  U) L. C- P
10:51:59 Message: 正在打开端口,请稍候...; f- }9 k; Y0 ?) p2 }
10:51:59 Message: 端口已经打开
7 S$ l9 G# q" W: R( W" q" Q10:51:59 Message: 正在连接网络设备,请稍候...
) C* n3 S7 l. a; v! M10:51:59 Message: 网络设备连接成功
2 Q# e6 a. k* x+ v10:51:59 Message: 网络设备已经准备就绪
- K8 y6 C2 o0 k" l4 _! {. _" e4 U/ M! O10:51:59 Message: 正在验证用户帐号和口令,请稍候...
4 E$ m6 q. p6 b% o: f; G. S10:52:00 Message: 正在接收验证/授权过程通知消息
3 K; ~5 V' B* Y4 r' {; r' |$ U! c10:52:00 Message: 正在与服务器进行数据交互,请稍候...  F7 h( |; I! h( L8 {3 @: k2 _
10:52:00 Message: 正在接收验证/授权过程通知消息
+ y1 {0 n0 h$ @; x: _10:52:00 Message: 交互过程结束( Y8 H" c$ j+ Y2 D0 E+ o; B
10:52:00 Message: 正在接收验证/授权过程通知消息
9 q, {- r" y4 L7 A10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
, S' \; o' o% S' y# T) E0 y10:52:02 Message: PPPoE连接建立成功
6 N' Q5 h2 I2 X10:52:02 Message: IP -> 192.168.0.2
! f% a' Z# W% `  O! Z% w) n8 q10:52:02 Message: IP -> 218.109.100.70
$ W2 `* m+ e) u  ]10:52:02 Message: IP -> 218.109.98.169
3 B/ h6 z) t5 Y% |( @9 n" Z, _2 H7 a
8 R' ~5 c3 g2 v5 g! S# C

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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