下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。
2 H, i9 `5 V0 i5 ?9 j8 c想编一个程序,实现类似于网通拨号器的功能
1 t# |& V$ N$ h# y7 U1 Z3 Q. Y( a
10:51:59 Message: 正在打开端口,请稍候...
% }2 Y) V# [7 _10:51:59 Message: 端口已经打开* t3 u1 l  J1 ?, s
10:51:59 Message: 正在连接网络设备,请稍候...2 _5 h* v" ^1 x4 s4 j4 w5 l: f
10:51:59 Message: 网络设备连接成功
1 T' D3 i/ c5 N( F8 q  h. Q10:51:59 Message: 网络设备已经准备就绪8 B* F6 j; d4 K8 P; b
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
& h, ~. j1 r6 n- Z+ \+ S! T0 ?$ R10:52:00 Message: 正在接收验证/授权过程通知消息
0 s& i; n+ p3 O; q. y  b# U10:52:00 Message: 正在与服务器进行数据交互,请稍候...: t1 {) i: V* a0 L2 i+ S
10:52:00 Message: 正在接收验证/授权过程通知消息4 O+ o# Z" H& M0 ~" |: _$ h+ G
10:52:00 Message: 交互过程结束
; \' i9 E5 X8 g" P! o10:52:00 Message: 正在接收验证/授权过程通知消息- ^5 o, R" |/ A/ V
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接& ^6 }; Z6 s6 ?+ b6 ^5 h
10:52:02 Message: PPPoE连接建立成功5 |( B) ^, K8 \1 s/ K* k
10:52:02 Message: IP -> 192.168.0.2" E  X! U( E0 H+ ?
10:52:02 Message: IP -> 218.109.100.70
: P5 R3 V: w) {10:52:02 Message: IP -> 218.109.98.169, }" i8 ]2 r6 _2 y6 @( i; m6 K

" }$ ~; T- A! f, y! m; I5 C给一个实例的代码好吗?5 F' n$ m8 B$ h7 V9 K: F6 x
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。4 u  V( d0 {6 O# {; r; y7 l
我没有编写过ppp之类的软件,没法给你一个实例。
# D# r8 d7 X( E我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
) b! l1 G6 w! c# o" T2 @标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API, ~0 }6 R- i7 [7 s4 @9 f8 H

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
  P1 l* p& T0 s8 E5 L; C" a 我没有编写过ppp之类的软件,没法给你一个实例。* ~2 L/ w4 J! W' c% a
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。+ k0 p3 r. _$ J9 y8 j. t
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API! J! k. ~* t/ F2 y
/ p# A7 S" a5 L: P$ s0 d
; i8 l2 L  A. h5 I' X5 f- P4 Z
很可惜,真的太可惜了。  z, _. i4 A9 j2 i4 `
标准的拨号只要调用几个简单的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
' m& ^, x  D9 P* S, D3 R/ E% B" ]+ O6 y* Y: s% X* T
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息
) O, D# k7 n7 @' v% d
# @  L+ |+ `+ N+ ihttp://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
% G7 Q+ H% \6 \  ^8 Y" s有一个RasDial拨号函数的定义如下:
) C% M; u' F: Y& f3 kDWORD RasDial(
( \2 z. i6 p7 m. I# J- `LPRASDIALEXTENSIONS dialExtensions,
7 A5 N3 I. B' VLPTSTR phoneBookPath , 3 |- D% B4 y) K
LPRASDIALPARAMS rasDialParam ,
$ Y5 i( e5 d1 X/ v: v5 s$ UDWORD NotifierType,
  t% L" m3 x0 i  k0 PLPVOID notifier,
' q  d( m9 ~' p# s% tLPHRASCONN pRasConn );9 }! l, l/ u. T6 @# I  @

4 U% n4 G% Z" h) v) {' k( \4 Z我的MSDN的解说如下:0 m; C2 ^& H% t( h
Parameters( j; L/ @# h, m& s5 {; J
dialExtensions
5 j/ n1 x. K# i7 a3 @7 y2 UThis parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options. 3 l3 W" `* B' a* Z- j& S, h
phoneBookPath
$ W6 L$ s& i' O7 w  C. T, S5 p: DThis 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. # z7 A  w- I7 D2 a' V2 ~$ q- o
rasDialParam % K% C# u: M! v% W  g3 S
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection. 3 k; D  o! ^7 a; F, o/ K  \. {
The caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. 1 E. x" E- E0 Y9 A+ Q
3 {3 C* h* B4 L
NotifierType ' j3 _$ Y. f0 w
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: 2 q( B6 r9 [  D' r
Value Description   _! z2 P4 }. n" W3 U7 H6 I2 U( k
0xFFFFFFFF
' j6 q* }5 T# B0xFFFFFFFF 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.  . h! ]. T* Q4 E0 ^: p( v: t# A1 f/ I
The progress notification message uses the WM_RASDIALEVENT message code. ; L3 o  s1 t5 I' ~! M

4 x& d) f% p6 m' i# \) q1 g3 _( L+ R( r
. u7 G- M; F" q2 f2 Z, c

8 g. Y$ m; J* V  lnotifier 6 @% [3 ]( B6 b) G0 B7 z8 X
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.
; C) M5 ?2 Q' I2 o- q4 E" a  jIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed. + l3 H  v, K7 Y8 E: K7 d' R# D6 {1 e# F

* I$ E2 i& j. J3 A# cIf 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:
9 t$ i4 X6 b: O5 H
: S8 c' i% E/ a8 g- t) z) R+ |, [- S$ OThe connection is established. In other words, the RAS connection state is RASCS_Connected. # v5 x( z5 B' r# G
The connection fails. In other words, dwError is nonzero.
1 u' w% Y4 _8 Z8 F7 b# K; DRasHangUp is called on the connection.
+ q& |3 `6 W1 b& i; ]The callback notifications are made in the context of a thread captured during the initial call to RasDial. 3 s7 L: x, u4 d

$ S7 H5 r8 k9 k( l9 n6 HpRasConn
, a# l1 |- n! I9 m* UPointer 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. ( t( f0 _, N! O; Y9 R
Return Values% g$ j- ]8 |2 m4 G: ~; U
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.
# N' Z/ u  {8 r$ t5 q
8 s- U( i" C$ `Include Raserror.h for definitions of the RAS error codes.& z2 w& ~! z1 D6 {
& K" x/ p% E; _* ^. e! |& J8 P
Remarks' N, h0 ~" q$ `9 A% O' T3 ~: U% W
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.
  M: S% ?  v6 @' P: V7 T1 C7 G5 S) J# _
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.! m7 V  `+ }& ]  {4 Z' m8 F
8 f1 V) P1 {$ z
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  l: P( l9 h  i" r
# h* }% V! x5 F; E8 M! uAn 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. ; b6 [1 u$ X+ K
2 }4 \# B) ?% s# R. {' Z$ @
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.
" y6 F3 g% W9 w6 E! e. F
  k) {: I9 ?" Q8 S5 ]* r0 C1 w8 qThe 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.
9 y. K  I4 U" `6 j' P6 U; C" _
) I% D7 `8 s* [3 S' E4 ^3 @/ [看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号6 O/ ?( o: ?) K# i
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);# H% ?+ J! Q7 q; J( ]
第五个参数是个回调函数,一般都定义如下:
. ^  S+ P: {: Y# O! jvoid WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)) @, K5 V7 f  }2 T3 R% l
{
7 Y9 }* M4 K1 [" ^$ z        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
/ m; f2 m1 U: R- J% [1 P7 l        ' R( m# \0 D! v' t/ @7 J/ f0 i; g0 M) C
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
4 X8 _6 U& b* ~  G}# {! ^% f- i* D& K1 s  z: Y2 h7 c. }
这个回调函数将会把拨号的状态POST到各个窗口句柄。
) ~% c+ S3 S! Q( x1 Y. ?
5 w/ v* d% h6 e/ X- J9 h0 A6 O

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃, S! s1 {9 |+ ~4 D8 ]* e2 D9 d5 J( }

% p1 o; d7 _+ B: r( r% H% J5 o4 B
: @1 u2 y& D% R1 m# u在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出7 y  v6 d2 b5 o/ z/ D( K
10:51:59 Message: 正在打开端口,请稍候...* |. S. H" z8 {- _# L" S8 N% B
10:51:59 Message: 端口已经打开/ j1 i3 z. A- T7 R/ |
10:51:59 Message: 正在连接网络设备,请稍候...
" ^) {  `2 \3 P" x10:51:59 Message: 网络设备连接成功% B' f$ I. A" Y; @
10:51:59 Message: 网络设备已经准备就绪
7 u$ k  n% b5 s8 }10:51:59 Message: 正在验证用户帐号和口令,请稍候...1 \9 _4 [0 t. K0 }5 {. P+ ^
10:52:00 Message: 正在接收验证/授权过程通知消息
% `2 V7 Z/ N+ O7 [/ j10:52:00 Message: 正在与服务器进行数据交互,请稍候...
5 |7 [' f, O4 s/ e* v10:52:00 Message: 正在接收验证/授权过程通知消息  f* w7 N* q, A1 K4 f/ `9 t1 ?
10:52:00 Message: 交互过程结束
( G) P! T% J/ R$ a, S, C$ E10:52:00 Message: 正在接收验证/授权过程通知消息: z2 E, ?; R5 R. X
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接; g, ?6 Q+ y( b  G* m
10:52:02 Message: PPPoE连接建立成功
: e$ A+ D: |: E- b: f10:52:02 Message: IP -> 192.168.0.29 r+ p7 \+ ?" {
10:52:02 Message: IP -> 218.109.100.70
/ P( j  T0 \$ T4 {# p* X3 F7 B- C3 o6 F10:52:02 Message: IP -> 218.109.98.1698 I0 c3 c5 P4 r; B

, V5 G* G; z- H, C% w4 c0 y3 j

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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