下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。6 d# K" F5 r- h
想编一个程序,实现类似于网通拨号器的功能
$ F& Z. g$ l) e
) C# G- j4 m7 A, I& v' S10:51:59 Message: 正在打开端口,请稍候...
2 g0 Y5 N0 k% T3 T10:51:59 Message: 端口已经打开7 O3 j) @; J' W) _. @0 u
10:51:59 Message: 正在连接网络设备,请稍候...
1 M! O( y% n# H& W% `8 n& I10:51:59 Message: 网络设备连接成功
; ^& N1 N& c9 R' b: G/ d10:51:59 Message: 网络设备已经准备就绪
. ~6 B: \8 T8 k10:51:59 Message: 正在验证用户帐号和口令,请稍候...
4 v5 V$ {" U2 }; I0 y% \10:52:00 Message: 正在接收验证/授权过程通知消息2 H) U) _0 W3 p8 E5 Q6 W% M
10:52:00 Message: 正在与服务器进行数据交互,请稍候...; E! }4 D! d9 P9 q  `! L( g/ A
10:52:00 Message: 正在接收验证/授权过程通知消息5 ~" T$ I5 y# E7 W
10:52:00 Message: 交互过程结束  j  G) O$ E5 {& B/ o2 z5 {
10:52:00 Message: 正在接收验证/授权过程通知消息) y) V+ |* O; Q2 [4 A
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
2 m& f# w- C# C6 R5 i4 x; ~10:52:02 Message: PPPoE连接建立成功
7 v) x+ {- E+ c7 A) ~1 T0 @" B10:52:02 Message: IP -> 192.168.0.2
' \+ q+ |" }2 w) ^( G6 V# g10:52:02 Message: IP -> 218.109.100.70
( P7 W/ r* c/ ?1 z10:52:02 Message: IP -> 218.109.98.1694 l4 e4 i0 ?7 W5 d2 z, h- C# l, d

0 e: }9 l* H6 X& [4 G! t' k给一个实例的代码好吗?' {+ g5 U7 O2 X
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。
, M* I$ {5 k3 t1 D7 v我没有编写过ppp之类的软件,没法给你一个实例。5 u# H9 ?2 q, q9 r1 C7 d4 b
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
) ]7 e, [  [- h" s标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
2 p/ Q2 ~) u& x

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
" _& A3 F; L" K4 v 我没有编写过ppp之类的软件,没法给你一个实例。
7 O1 R7 O% }2 N1 b4 R5 p* I3 L 我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
, o. u2 h# P" g' }3 u0 R. ] 标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
6 k6 G- C9 |2 Z
9 P$ s7 t: y3 Y. W
& K; L! ^0 _! l
很可惜,真的太可惜了。
% z7 X0 q9 b: g1 Y3 F$ E标准的拨号只要调用几个简单的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" C; Y5 Y4 O5 q& A

5 D+ U$ s3 E3 ]+ d3 s是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息/ I& j' j+ X; i  e2 G; p  z6 F3 n
- \( T1 X+ S) F# }' B
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。. i0 j, Q% }% m* ^
有一个RasDial拨号函数的定义如下:
0 W3 z, j9 e  p$ ~: MDWORD RasDial(6 I+ a! J; F6 t6 P% ]
LPRASDIALEXTENSIONS dialExtensions, " y3 m/ ^# Q) [1 v
LPTSTR phoneBookPath , 5 E6 N& M* x( |  G& u- a5 y
LPRASDIALPARAMS rasDialParam , 8 b6 u( r. n2 g
DWORD NotifierType,
; l* x, O/ `2 U% T+ b: v, FLPVOID notifier,
2 g2 Q7 P5 s2 r- K9 O( {" G1 PLPHRASCONN pRasConn );. s& T* O7 j8 F/ W) y$ E2 ^( b

& V5 l* z. L# v9 {0 N) Y7 `( D( Z我的MSDN的解说如下:
, l2 G* j% U* j/ B& ~5 c2 j/ dParameters
6 r( b+ T. a3 @9 `dialExtensions
0 o5 [( o7 ~* l3 D+ h% R- f4 G( eThis parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
( L) r$ f- R. E2 lphoneBookPath $ D  ^1 O: I- @. ]5 _
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. ; h1 K2 L, u/ I! s, [/ E9 ]% @
rasDialParam 5 I' o; u  i4 |) z
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection. + w4 w) Z- C, R# z1 w: O( J. w
The caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed.
' _8 }1 @. B9 g  S! ]' E4 }' V4 Y3 r  n# L
NotifierType
3 M% S* J: _7 T# }6 q6 e/ U5 l  hSpecifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value: ( P7 S% Y- Q5 _7 ^1 o9 y
Value Description 5 {! Z% v  `; @
0xFFFFFFFF
- R7 m& s1 Q6 W6 v- {' k0xFFFFFFFF 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.  
) X& y5 [# y1 C6 ^ The progress notification message uses the WM_RASDIALEVENT message code. 9 X/ j) M  a  Q
. E& w7 s( ^' r7 \1 U" W/ q8 h- p

3 ^% M) h# c# z1 {, f
/ H6 P* o) v$ [- E/ h3 P5 E9 @$ g; a7 m' Y* ~8 x
notifier 0 u: z* _) V" b- m3 c
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.
+ d; U1 f1 o% V' P7 L9 w$ Q: NIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
  X. ~  n- k% \6 p' J* N
- Z3 d5 @  r0 ^, M9 o) lIf 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: + f! {6 y7 U9 a( u
2 G" n1 m1 S/ N. S+ [
The connection is established. In other words, the RAS connection state is RASCS_Connected. - n, Q, e4 Y& x1 S. `% W& H) F
The connection fails. In other words, dwError is nonzero. ) ~) P+ q  T. P' a
RasHangUp is called on the connection. 9 H. R3 b" M3 J. W- W0 Q3 ~" b
The callback notifications are made in the context of a thread captured during the initial call to RasDial.
2 M( @4 J, P& Y
! N" H7 h$ u& u/ _. xpRasConn
% b: E& L3 {, k7 m- g6 {7 y; yPointer 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. $ \) x0 J5 C" S8 ?6 F0 M- x
Return Values
: W) D! ?( M" {& D8 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.
- d# w( _! I2 X6 s7 U+ f$ U' J. s7 s5 |  Y! [
Include Raserror.h for definitions of the RAS error codes.5 x5 p6 ?% D" r
+ V3 C6 U# O; q& t/ q
Remarks
$ H0 h' n) Q/ `The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.7 H+ R# g0 D- W3 c! Q, }$ ]

+ a/ c6 @* F% v, A3 C* Z  J! d6 j, F' iRasDial 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.
- L" P$ l( `% e/ Q
# d, l$ }  r3 L7 GErrors that occur after the immediate return can be detected by RasGetConnectStatus. Data is available until an application calls RasHangUp to hang up the connection.
* V) w6 L: q1 \- M
$ T; Z5 ]: N$ Q$ H7 z3 u" F8 jAn 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. 3 s( v* i5 @" g) ~- v3 q3 v8 ]

" f9 q& C* k7 D5 l8 t+ L/ t8 G. BAn application can safely call RasHangUp from a RasDial notifier handler. If this is done, however, the hangup does not occur until the routine returns.
4 h. \$ I7 B" ]% [' x  a1 i( `0 @7 j4 j, ]- }# f
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.
/ q/ q3 j* k. b+ m4 P+ q" w4 g6 R1 W* |9 X& @) r% o' A
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号" _2 X  i: }: e4 X7 J
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);' v& K0 b: D4 ?. @# J
第五个参数是个回调函数,一般都定义如下:& Z8 R) P, p& [" Z
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)% Y5 j. p  h) h3 E) K
{+ N& c7 L! h( C: J/ c% [
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
2 e6 K" i% M3 ^5 S0 u        7 |# r4 Z8 B, e0 u$ h$ U' g
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);: g9 _8 s9 _# f. V9 i: O. K
}* V* d3 @& O# {' z$ Y$ f- P
这个回调函数将会把拨号的状态POST到各个窗口句柄。
, M2 J* V; H, {0 l4 d( S0 f1 B
& ~; k& i/ r$ x! O7 }* E

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃, l# n4 i# y$ J( n( R

9 c7 I% M: `3 K8 v7 R5 b! f) V9 U; |' {7 B$ @" a/ C
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出7 L+ w+ I# P5 f
10:51:59 Message: 正在打开端口,请稍候...5 `8 B$ j9 G6 X! a/ a& I
10:51:59 Message: 端口已经打开$ O% f9 j7 S4 c8 R* V5 X
10:51:59 Message: 正在连接网络设备,请稍候...
: _# c2 v  b; e) \10:51:59 Message: 网络设备连接成功' r$ d. T6 y7 O" y5 I" E
10:51:59 Message: 网络设备已经准备就绪0 _0 i1 T. D% n- U% R* m3 U
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
/ A$ a; x0 I8 _. F+ K* b/ N10:52:00 Message: 正在接收验证/授权过程通知消息
/ {6 F7 o1 I( g9 D( G10:52:00 Message: 正在与服务器进行数据交互,请稍候...
6 \! a: z' [% I1 J# N- @10:52:00 Message: 正在接收验证/授权过程通知消息8 g: q% y; a% \
10:52:00 Message: 交互过程结束" |! S. U* X: k& A
10:52:00 Message: 正在接收验证/授权过程通知消息
; ^# a$ A; }# B0 k% a. e+ w10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
* E1 U: d. _0 o# s10:52:02 Message: PPPoE连接建立成功* N2 ?! \( k# a7 d
10:52:02 Message: IP -> 192.168.0.2
3 _0 F% m) o2 G5 |10:52:02 Message: IP -> 218.109.100.70- O& Q. w9 f. D0 N
10:52:02 Message: IP -> 218.109.98.169
: ]& I: W, W3 b9 j* C% O4 q; ]+ [5 N" \6 m' N

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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