下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。
+ e, a: S0 {( I  N5 H6 h想编一个程序,实现类似于网通拨号器的功能. Y& H$ h: z0 L* o# G. T7 Y

: A3 `3 T: Z4 K% t/ }' z10:51:59 Message: 正在打开端口,请稍候.... I( ~; v/ N9 F; c3 A3 n* Z
10:51:59 Message: 端口已经打开
1 k* g6 Z) A) L6 Y1 Z! B" }6 [. W: s10:51:59 Message: 正在连接网络设备,请稍候...( ]; z4 h! `+ g  ~
10:51:59 Message: 网络设备连接成功6 V! U/ s# K5 m; O/ b, _0 P- L* t
10:51:59 Message: 网络设备已经准备就绪- [" R; j7 J5 M$ Q5 _8 n+ X
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
! \3 u  ], C% S7 A9 X10:52:00 Message: 正在接收验证/授权过程通知消息: X+ Q. E2 W- z
10:52:00 Message: 正在与服务器进行数据交互,请稍候...) h) @; Y( \) Q
10:52:00 Message: 正在接收验证/授权过程通知消息; R- X3 d) l2 l/ V8 V
10:52:00 Message: 交互过程结束  c" U* H; H7 `4 U, V; n
10:52:00 Message: 正在接收验证/授权过程通知消息
( t% ]# }* h* ?0 u10:52:00 Message: 用户帐号/口令验证通过,正在建立连接6 f+ e6 N6 |3 m
10:52:02 Message: PPPoE连接建立成功
2 N/ |- b. t) c10:52:02 Message: IP -> 192.168.0.2
' N2 O# L- R2 F10:52:02 Message: IP -> 218.109.100.70
9 l8 g' t% Q/ Q2 c" _8 \10:52:02 Message: IP -> 218.109.98.169- s2 h, ~6 ~& c3 R
0 S: V7 X, J9 t0 S5 p; X6 u- b" [# ]) m
给一个实例的代码好吗?  B! E) o. ?8 M+ Y  z& I- t( U
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。# w! S2 a$ W+ K/ U* U- |
我没有编写过ppp之类的软件,没法给你一个实例。
% \6 J- t8 o" F" k, U/ Y" y/ R我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。- i) b# O  M9 k% f4 S4 C
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API# w4 U' i. C* a# K6 `4 ~1 O

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:" T0 r! h% L: `- p
我没有编写过ppp之类的软件,没法给你一个实例。
1 Z& M3 E0 M. G& @) ?* l6 }6 | 我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
+ b5 p1 i% w& i9 P 标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API' D# w7 b9 D, P! c8 T$ D
  ]0 c' m% z1 A% X% W  B
# L; q/ Z( `/ s$ l5 z
很可惜,真的太可惜了。- d- ^. c  u" S. i1 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
4 F+ K; f( Y# E+ F) D3 @8 I- b8 D1 L. }5 J6 B
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息( D8 c2 U+ q! m/ X# W+ b" d
3 ]% j6 K0 b6 D6 }+ N
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
& A1 |  C3 K  z9 ]8 s- r5 S0 }( Y1 u有一个RasDial拨号函数的定义如下:
4 i) v  R8 P! p2 EDWORD RasDial(8 b& U/ ^' g1 c" H3 I0 Y
LPRASDIALEXTENSIONS dialExtensions,
+ r* z  C& |0 Z9 c7 y8 j  ]LPTSTR phoneBookPath , 6 O$ k/ g! }0 B; H) v3 ~2 H
LPRASDIALPARAMS rasDialParam ,
8 g9 ~- C* ~9 }3 I' Q$ ODWORD NotifierType,
9 [+ H3 s) O4 R+ w8 U) t9 }! |/ \8 ZLPVOID notifier,
5 {( r6 l8 u! }" _" e! L  fLPHRASCONN pRasConn );! T6 Y+ ^+ j" D, Z% A& E: z
: F3 ?  ]) F& O5 C
我的MSDN的解说如下:
9 G# J4 h. r; F, IParameters
1 ]7 y0 f+ ]( C* WdialExtensions + R; k7 ?$ I* G3 p; `
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options. & `5 R; `% x' G; e
phoneBookPath
6 `% |* @0 n- C) ~# F- tThis 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.
" T! K: t( ^& @7 ?6 E4 VrasDialParam + e' X) _7 E. J! G& I5 d
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
1 E( B7 \3 D2 p# DThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. . i7 Y5 V2 C7 @+ r4 f
7 F  ?3 i% t8 g$ u
NotifierType
1 w3 Q; S! `% Q( zSpecifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value:
2 D. J2 W" |# q& GValue Description 7 O- t, m. ]$ @6 C6 s0 Z
0xFFFFFFFF
/ `8 y. I. I* S& P' T- E5 C- f$ G0xFFFFFFFF 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.  : T& u* y! w9 T) I( `8 G
The progress notification message uses the WM_RASDIALEVENT message code. / T" J) \1 v/ S

) c0 R4 O( q3 k4 @2 a' \5 q6 {
7 D/ t! Y  a1 m  s( w6 z& ]( g5 B% O
& n( c: B* E$ D2 R/ ?9 V
notifier % J! U2 a; O. M! u! Z& p5 Z1 O
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.
3 t; t) t; A! V: i( Q2 n) F' `4 FIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
% o+ b3 D, C6 v/ u! Z
% X7 V* Q. r& z( q2 `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:
+ n9 r+ @6 M- O/ _1 N* D  t
  f* K4 I* ?8 t  P  d3 k' FThe connection is established. In other words, the RAS connection state is RASCS_Connected. 5 i1 I6 h6 g  @: y" L3 y
The connection fails. In other words, dwError is nonzero. 2 j& k' C- p2 T! D4 O" t8 O; b- J
RasHangUp is called on the connection.
; n, i! f$ R" wThe callback notifications are made in the context of a thread captured during the initial call to RasDial.
8 p" G! T- [2 h' Z6 J' M5 y: n" v8 b8 _$ f, W$ m6 L
pRasConn 7 `1 p6 U/ W. F, L, A
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.
# e: E' }# D) @  JReturn Values
# b" \! Q% K5 P- rZero 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. : m; ?* V! Y  F  h( j1 U& y) ^

, w& @2 j2 h" q5 U; Y7 QInclude Raserror.h for definitions of the RAS error codes.: e. A4 b2 @1 I+ H0 f

" P1 ]6 Z: w0 x2 U* n; r' URemarks& P5 T, v( T6 ]8 E
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.$ T5 \: P/ u) ~2 G3 R5 V, B, p
) ^+ |6 c, B% {8 s
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.' y+ s, R8 [& ?7 ~& h1 E. C
* W, G% F) q6 R# v
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.
3 _% }  e: l3 b! ]$ S5 L  k1 Z1 n0 `6 {" T
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.
5 y+ F; Y" ^! ]! s9 @4 t. q) U- ]/ x8 Q5 U2 @* K
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.
, G4 k! M$ ]4 p& V- w8 l; ]7 K! \
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. * D7 G( i& g( b: m; P
- V. [: ]; A/ ^5 P
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号$ I3 Y+ ?  j" k) I
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);$ {7 O$ B" o8 n, _! L9 J
第五个参数是个回调函数,一般都定义如下:9 q# S' g7 d) b" _" L
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)- ]5 `1 Z% k* M" n$ c
{
& o  I2 @' N* T1 l        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
% q# r4 ^" V, }4 _8 f' \       
' X5 G' S% |  m! Q4 `9 ^8 c        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
4 \3 o8 u: |/ b3 J}
+ U2 v1 }' |2 [这个回调函数将会把拨号的状态POST到各个窗口句柄。! q4 b& G" u0 S4 |! B9 T
* Y6 }9 |" x0 x8 @* u

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃" x) K( {) e) j* ~8 r! z
3 b% t% n* u1 L2 a- I$ C( d
- J' v" T# W& Q' Q. {
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出7 _7 K$ |# ?. N- {( N; l
10:51:59 Message: 正在打开端口,请稍候...
7 v9 R9 G. x# \+ l0 C10:51:59 Message: 端口已经打开
8 b! ]. l) c5 ~% L5 y10:51:59 Message: 正在连接网络设备,请稍候..." _% ?% x* e5 k; n- Z. y( R5 D
10:51:59 Message: 网络设备连接成功
8 e( l+ r9 i; V( K10:51:59 Message: 网络设备已经准备就绪
. |; g* l$ @2 q* r6 \9 U7 v10:51:59 Message: 正在验证用户帐号和口令,请稍候...
% ?3 M) m) I, {1 q* ~1 s6 u10:52:00 Message: 正在接收验证/授权过程通知消息
/ V$ j, e$ U8 L# U+ N) S6 \% a10:52:00 Message: 正在与服务器进行数据交互,请稍候...* j! W9 K& `7 e. R7 }$ c
10:52:00 Message: 正在接收验证/授权过程通知消息
+ s+ e% Q7 |7 V5 m4 J: l5 l' D10:52:00 Message: 交互过程结束8 R% N* g1 K) t0 b/ n0 k
10:52:00 Message: 正在接收验证/授权过程通知消息
2 J- U. s1 |1 h! M2 m, T9 _10:52:00 Message: 用户帐号/口令验证通过,正在建立连接* ?4 y. ?  l* O
10:52:02 Message: PPPoE连接建立成功' @% x: Y5 v9 W# Y5 F6 l
10:52:02 Message: IP -> 192.168.0.2# G" U- K& w3 d# h
10:52:02 Message: IP -> 218.109.100.70
. Q+ h, X7 u* `* ~10:52:02 Message: IP -> 218.109.98.169+ i# k+ C; C# h7 M1 B6 Y; V# b) S; @
/ J& c( ^. y, A% }3 n

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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