下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。
* j# Q3 e$ L' v  c; g5 V/ V9 A. }想编一个程序,实现类似于网通拨号器的功能! C9 e: m9 S9 g; m# s( Q) J
6 O% S( Z. c* o: b0 I
10:51:59 Message: 正在打开端口,请稍候...4 Z& T5 ?) d# ~- i& c( f7 U
10:51:59 Message: 端口已经打开4 r4 a, H) d9 C2 |$ ?
10:51:59 Message: 正在连接网络设备,请稍候...
& P" b+ G# X) R10:51:59 Message: 网络设备连接成功
; K  M2 v* L2 X9 E1 P$ n8 X% L10:51:59 Message: 网络设备已经准备就绪
6 x" T1 K; P* F: i10:51:59 Message: 正在验证用户帐号和口令,请稍候...* C: E$ B9 Y5 m3 ~# z' Q
10:52:00 Message: 正在接收验证/授权过程通知消息0 m/ j5 J6 ]* Z) N
10:52:00 Message: 正在与服务器进行数据交互,请稍候...
5 |/ E7 b4 C8 I, f2 j6 W! w6 I1 M10:52:00 Message: 正在接收验证/授权过程通知消息+ N' ?- o) \8 v& a8 M4 a
10:52:00 Message: 交互过程结束
% |& m0 m1 {: E' A10:52:00 Message: 正在接收验证/授权过程通知消息+ C' d3 o4 H0 N1 j! {% a
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接& R8 B" K! B1 m) k: J
10:52:02 Message: PPPoE连接建立成功
- E+ {( M- f1 p. {! m+ y# f10:52:02 Message: IP -> 192.168.0.2+ ?7 b* Q+ g5 H. s
10:52:02 Message: IP -> 218.109.100.70, _1 B: d) o2 _, C; t0 `3 B
10:52:02 Message: IP -> 218.109.98.169
7 r, f  f! `; _/ w* a- {8 t; t+ \
0 ^! S, Q' G# H9 P/ n7 _- A给一个实例的代码好吗?
* V1 m/ N0 Z5 E我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。
  ~. E" _) X7 ~) `  `" @/ b! Q我没有编写过ppp之类的软件,没法给你一个实例。
  @1 e5 P3 r3 x我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
& N; L/ w  L+ H标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API+ A" J* z$ S& S2 p; V% u

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
! U- q5 ?- V2 j0 s 我没有编写过ppp之类的软件,没法给你一个实例。
. L% L/ {) ?0 a% i* G7 i6 ? 我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。+ z9 j8 o# t  ?% F* h# c
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
& S; T/ F5 m6 i3 @

( Y8 S7 R% t/ h2 Q
5 x6 B8 y3 m1 E0 s' K很可惜,真的太可惜了。. f2 B. a! |( x! ?8 q- K" D, @+ G$ _
标准的拨号只要调用几个简单的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
. S3 Q# X, y* w  @! z3 S8 X7 w* L5 z  N/ G  {/ N
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息
# R1 \, i3 r5 ~, d! _+ d* z" A( g- O% y
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。+ I4 a0 D8 g/ J: U5 s3 ^8 A
有一个RasDial拨号函数的定义如下:8 Z; I9 ~5 I. f8 O2 y
DWORD RasDial(- C8 ~0 d  f* k- e
LPRASDIALEXTENSIONS dialExtensions,
! b  m' N5 J, B8 ]LPTSTR phoneBookPath , : g0 p& m( Q0 O
LPRASDIALPARAMS rasDialParam , 6 A% X& `  N7 v  m" ?0 m: l
DWORD NotifierType,
% @& j* G1 D8 J, n& ULPVOID notifier, , x+ [8 p6 @: ~2 T" y2 S
LPHRASCONN pRasConn );
# `! }) S: z2 U' h" U7 R7 ]! e+ Q& w* _& W- J/ J
我的MSDN的解说如下:. B4 p2 e! a9 ?& ^
Parameters5 [5 m- L, `8 V$ u$ \/ k5 S
dialExtensions 9 F2 a1 }0 v$ h% C0 T$ N% @
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options. 0 D5 ^" u% Y: r0 d, U( @/ j
phoneBookPath 7 T  {. c7 k/ r  j
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.
" v2 y& v" o' n. `7 MrasDialParam , g" P1 J9 s- ]" `+ X% Y
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
4 o9 W  J+ d9 ^5 Q3 T0 i  O: nThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. / [& D4 a6 B9 q  `4 V" l
7 V  M6 `7 B% ]5 N& u7 J7 ~  j
NotifierType * B) g4 a# `: J8 {
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: : ]4 n& N# Q9 _! _  B# g
Value Description . ?1 M# d* C4 v) E
0xFFFFFFFF
2 ]4 Z+ [2 c* w6 w% Y3 r* E! q0xFFFFFFFF 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.  : p$ v+ V+ |7 K2 K- a% Z! Q
The progress notification message uses the WM_RASDIALEVENT message code.
+ F7 G; [9 I) i% W* j/ U" @% O0 s0 \1 W

/ [7 E, a% S- L- z9 H2 K
" j8 u) J2 t& D' y0 D5 M; i8 r- s# O5 Y, H; E  {) G
notifier 8 o1 }6 z; y* v) B
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. 0 t9 H! O9 N9 f- f
If notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed. 1 W4 H$ O! h$ |
! D7 m& v7 \/ Q" G9 i, d! P+ n
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: ) c) }3 V/ c9 r: m/ n: s
% M6 s4 t& k, r7 Z% H* j4 K9 i
The connection is established. In other words, the RAS connection state is RASCS_Connected. ( X. M' W* D4 h- J
The connection fails. In other words, dwError is nonzero. + r! ^0 r  b) e& l5 O" P$ E; v' f2 i
RasHangUp is called on the connection. $ |! [; f& |  i+ \: R
The callback notifications are made in the context of a thread captured during the initial call to RasDial.
4 @5 u6 C0 B0 p7 F7 F" h# L, j4 b4 t% y* j% R/ U
pRasConn 0 E3 W. B; x2 {  w1 ^, W: ^
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.
/ B8 O9 I% @2 pReturn Values
  {! U& v" h! D$ q3 AZero 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.
3 u4 L% z2 |  M  S9 ^- D( {- o# `  b( t9 g. w# ]) l
Include Raserror.h for definitions of the RAS error codes.  `! l4 Z) R2 y5 q
2 N: [  j* \* @, B
Remarks" Q+ z* s& B; p1 U4 y/ Z$ k: R
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.* T: R6 l; N1 l4 V

7 e  Z" q8 j/ t/ i: ^* d( O+ ZRasDial 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.( G  r, f( }8 |2 V* B' D
; c0 Y4 n, M6 g* k" `/ W5 p: I
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. ! l' d, ^: ^. u- E; P' F) q

# a/ M  y* ~- f6 q* ]7 R( ^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.
' _. A3 X% r5 y+ ]/ P, P, t. i7 }, ^/ ]5 S3 J) f
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. 2 c' n# J, A7 G2 X8 P/ d5 L

- R" w/ \/ a. H5 k# EThe 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.
% R% s% V! u% g8 ^, ]+ J  Q  }) q6 r9 e( F3 {1 z
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号' Y: @: _( r+ M& `2 O+ u
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);
2 `0 n" j; Y) v7 X" W4 N  s' g" @第五个参数是个回调函数,一般都定义如下:
( P. H; o# x6 k% g0 b0 qvoid WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
+ }' D) Z4 Q) ~" b{  \# c+ O$ M# E# E. |: N# c
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;1 \9 L! B$ k2 j7 Q
        % e* i* S) S2 X5 d% U
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);& P. V9 _; _/ U2 j5 @% F
}. K0 B0 K) C" F2 a
这个回调函数将会把拨号的状态POST到各个窗口句柄。
, \0 S, ?8 c9 P, R4 [/ O* Q3 @9 D  n. R* I; Z# l( H) T

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃% E* |7 P; E6 ~, V4 }+ s
4 w7 s1 y8 V/ F% N6 e3 S2 B

. z/ @( o$ x5 S" L+ r# x在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出
5 L$ T* \% h3 h. M. g: x10:51:59 Message: 正在打开端口,请稍候...3 e: a, i3 T( |' y% ~, }3 v3 @, q
10:51:59 Message: 端口已经打开. _/ X( K! G) r- s. g% L
10:51:59 Message: 正在连接网络设备,请稍候...
) q) _9 A. }4 l3 d4 D10:51:59 Message: 网络设备连接成功6 o3 i7 _5 D+ q! G8 Z; A- C
10:51:59 Message: 网络设备已经准备就绪
& N) H0 u5 A9 n10:51:59 Message: 正在验证用户帐号和口令,请稍候...5 m5 u$ K! J8 r, K
10:52:00 Message: 正在接收验证/授权过程通知消息
: S8 N* b& i, o1 `3 \9 R! i) ~10:52:00 Message: 正在与服务器进行数据交互,请稍候...
0 i. h' `  W. y10:52:00 Message: 正在接收验证/授权过程通知消息) C6 T9 m6 P" q8 _
10:52:00 Message: 交互过程结束( W7 K; _, I& ]1 J, W  C! n) G
10:52:00 Message: 正在接收验证/授权过程通知消息
6 H2 B8 x, `0 m# k' V/ h; Q6 \9 k10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
: K. y. b1 }2 q* o& e7 V10:52:02 Message: PPPoE连接建立成功( D7 T4 p' x& j2 F3 X
10:52:02 Message: IP -> 192.168.0.2
  `: {5 i! T  S% _1 E% E/ T/ f( R10:52:02 Message: IP -> 218.109.100.70
6 }8 p" ~& q" c" O: C% k& }+ X' w10:52:02 Message: IP -> 218.109.98.169
$ K- t* c( y' q4 t0 ^% a- W
: [+ V1 I8 M, _

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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