下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。
) m# d8 a7 k; R* I5 S想编一个程序,实现类似于网通拨号器的功能
' `' m+ s+ A( b' H2 F2 U; A  a& ~/ }' G3 j
10:51:59 Message: 正在打开端口,请稍候...& K6 |9 X- q: b
10:51:59 Message: 端口已经打开
* ^. G+ s1 Q# A! d4 Z8 C10:51:59 Message: 正在连接网络设备,请稍候...
" i$ r9 N% h0 ^4 @( W1 Y10:51:59 Message: 网络设备连接成功
6 p# X! h  ^* [5 l$ I6 {- I10:51:59 Message: 网络设备已经准备就绪: z# J# f, S+ [' L8 M
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
1 d& }" E2 E" b# ?6 i" [. I# A10:52:00 Message: 正在接收验证/授权过程通知消息& k8 q& O! k) K1 ~1 D
10:52:00 Message: 正在与服务器进行数据交互,请稍候...
( ~  o& U6 J6 s/ p  J* O& D6 e& y10:52:00 Message: 正在接收验证/授权过程通知消息" [! k$ ]4 g. c# i
10:52:00 Message: 交互过程结束
+ N  I4 M) C' p! T* c4 Y( h) u6 g, V10:52:00 Message: 正在接收验证/授权过程通知消息
: G* Z+ K- l8 p10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
* Z$ S8 C* @9 {10:52:02 Message: PPPoE连接建立成功, D. z6 O# ~* g
10:52:02 Message: IP -> 192.168.0.23 X, W, p9 U' d$ j, l
10:52:02 Message: IP -> 218.109.100.70
4 q  _+ L: ^- R8 b0 t) q- H$ H  P10:52:02 Message: IP -> 218.109.98.169
- b0 F. {+ b- f: O, F
( @( o5 G$ K/ C) e1 T给一个实例的代码好吗?1 p  a, F5 ^4 j
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。
* q1 j5 I$ t8 z1 C7 g0 w  [我没有编写过ppp之类的软件,没法给你一个实例。
. @6 `; ~* q% @3 U8 b" w我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。$ i* }9 Z) H+ q) ~
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API  k: Y7 B: u# T

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
$ e* C7 g) q# E. _9 d 我没有编写过ppp之类的软件,没法给你一个实例。
& I8 {) L% Z- N 我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。$ L& S1 v  ?, T8 R, O" A5 I5 x
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API9 H2 I. e, Q3 ?, C$ I. D# J

- T" r+ m# M  v& Y1 A, T5 w) }! c0 O" @( B9 Q) L! x  P/ T& e
很可惜,真的太可惜了。
' v- B3 D* O0 I' s1 L+ 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
" k) E4 u5 z- c0 m* B0 ^7 r% M- u1 p: m2 Y$ W8 _
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息0 y# m6 Q& n7 Z( ?2 o

8 G: F4 ?* B3 R! F$ ^http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。2 W* k# z; |8 z3 z2 u$ M/ B" b0 |
有一个RasDial拨号函数的定义如下:
* {$ `2 a3 z& p4 s8 V: uDWORD RasDial(" s* o- b: h# o+ r0 m
LPRASDIALEXTENSIONS dialExtensions,
1 S! c1 _  b, C0 LLPTSTR phoneBookPath ,
- K6 G: c5 z) g* ELPRASDIALPARAMS rasDialParam , 3 d) i  H; u" i: U8 f
DWORD NotifierType, . E* ]: R5 r  O( O
LPVOID notifier,
6 b* d8 H% Q) c* i/ R3 ]" i' J: `LPHRASCONN pRasConn );
$ B$ ?1 z5 M0 Q9 u: Y, Q+ l! P9 G# j  b, {
我的MSDN的解说如下:
+ x8 V% B5 ]8 s3 L. Z( S, dParameters
8 [# d, n% v( kdialExtensions : \" u0 N4 E% F. {9 ~) M
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
, E7 p% ]: q/ @" F* r9 zphoneBookPath / P! [6 i' Z; W# _
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.
2 Y4 O' z# X- Y; q6 t* \rasDialParam
3 `0 M% E- R6 q- r1 aPointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
. H  s+ g0 _  g" G2 jThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. . U3 f( d  [& e* H. m- ?! u

9 m' G' ]8 @- t& D% q/ D* {NotifierType
$ j. X' c7 n) fSpecifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value: . U0 d4 a3 W+ L8 u) d- i& M
Value Description
1 u; a- b4 g6 g) w4 n- ]0xFFFFFFFF
8 n6 H4 A% a7 ]7 L! X0xFFFFFFFF 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.  
0 p% K& I5 }; j. g/ M# w The progress notification message uses the WM_RASDIALEVENT message code. 7 K5 U% H7 ~( A
5 k: o8 V: U6 t3 j: N
4 k0 i; |3 F; J2 ~

8 q0 |9 B5 R0 r4 J
' d, c9 f' N! P3 Y  onotifier 6 J. `0 v+ Y: ^& y
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. ) w2 I2 a) V: k/ m! }# M6 v" L
If notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
1 g6 _2 m' l; h- b4 R+ z4 s6 A/ |
$ Y3 @. G, v( RIf 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:
; E9 o2 A2 l% e8 N* ?! P( l! K1 L
The connection is established. In other words, the RAS connection state is RASCS_Connected.
/ l7 {/ n( X. L' cThe connection fails. In other words, dwError is nonzero. ! F* N1 h0 m; u" f# {1 o
RasHangUp is called on the connection.
! r0 F) j. r9 y: b# e: yThe callback notifications are made in the context of a thread captured during the initial call to RasDial. 4 u+ ^2 b3 m% d2 v

* r# R0 l1 @& }& L& d* K; ^( NpRasConn & J# Z3 O% m2 f8 ~- d7 m
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. ( i: U% {# U7 v3 V
Return Values: t, K+ p/ d0 i. P+ r" Y/ \
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. 2 d, S& p4 Z+ q5 `% A
9 `4 c2 @  a! D3 ~0 v1 A. H4 n
Include Raserror.h for definitions of the RAS error codes.8 {3 {% F' r3 e; T
+ {* h6 K% j3 d- q
Remarks! N( v* W, U8 Y1 V$ F
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL./ R4 f" C- f8 u1 x) i+ S# }) X1 V
- g3 ]# x8 B$ s' i$ g: v; d
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.3 I/ i" w8 c- S* w

7 z* G# A  D8 }% d9 ~9 R0 I, iErrors 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; ]& w9 P- B- x. N7 S: I2 b- Y: K
. g) {# u. W/ m2 N6 o
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.
" q! ~1 x3 Y7 F$ q$ D. e
* P2 `+ G4 A* W9 w. jAn application can safely call RasHangUp from a RasDial notifier handler. If this is done, however, the hangup does not occur until the routine returns. ) Q8 Q* G7 ~: o2 ~

- p4 u8 a, m, rThe 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.
& P. a/ E8 W( j5 i8 M1 Y1 S7 B: T6 x
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号
1 z3 Z8 w, Y1 G* a# X% u  k$ r9 fDWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);+ l( J7 M+ L% v0 O
第五个参数是个回调函数,一般都定义如下:* Z6 B! j' A4 S4 j1 a) J5 Q
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)* D/ y1 ]  I% }+ X) X
{" c- H5 I5 E+ r4 {+ n3 ^6 Q/ z# b+ ^
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
) I6 I8 j4 n( F; A( P; M       
* t; d# o( ^& a  _5 \, N) k        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
' Q' @8 H* Y$ v5 Z}' G& N7 G1 v$ Z4 V  q4 O( K
这个回调函数将会把拨号的状态POST到各个窗口句柄。! ?8 i# }4 E+ Z2 l" K
* [2 `% ]4 y4 {4 r. N; i% K2 d

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃" a7 u( b; p$ J$ N/ F: k  P
8 w1 a6 \! b7 f0 c* L

0 v4 S2 X6 t( s' q( c, a% o$ A在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出
' [1 d7 f' ^, ^% E' a3 M9 x& C10:51:59 Message: 正在打开端口,请稍候...# r4 G- E' t* {; l. {
10:51:59 Message: 端口已经打开
* D0 p  @8 s4 {9 y" U10:51:59 Message: 正在连接网络设备,请稍候...
" Z4 R7 f% U- U/ [  z10:51:59 Message: 网络设备连接成功
8 N; b2 v; p& i10:51:59 Message: 网络设备已经准备就绪  ?8 \. g9 A& I9 a& `% T
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
, f8 u0 F$ Q+ C10:52:00 Message: 正在接收验证/授权过程通知消息
1 a; W) J2 j+ ~. t3 L4 j. e( ~$ p0 |6 x10:52:00 Message: 正在与服务器进行数据交互,请稍候...
( N* @5 B# g; h: H" j) c/ Q9 V10:52:00 Message: 正在接收验证/授权过程通知消息' J: s( M/ q( `# \& M. z" J
10:52:00 Message: 交互过程结束
- Z; I5 s: G; U/ i" e9 j; r$ E10:52:00 Message: 正在接收验证/授权过程通知消息1 O2 X7 Z# ^: x! o. G
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
% C& s, [' K8 @! }0 x+ U( g- N10:52:02 Message: PPPoE连接建立成功
  Q+ t+ c' z4 l& N+ l: P10:52:02 Message: IP -> 192.168.0.2; t& c8 z) t1 A7 V; E, D
10:52:02 Message: IP -> 218.109.100.702 N  n5 d; ?& g0 M
10:52:02 Message: IP -> 218.109.98.169! _: x( o( A0 i0 d* Z7 S

* V1 ^3 {4 j: J" @* a) s/ n7 ], Y& e) J

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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