下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。  z* N. p8 U, I; x/ k+ N" r
想编一个程序,实现类似于网通拨号器的功能
* P. C% T; ~0 R' Q; e" N
1 v. i' n/ k+ R9 T  v0 J9 ?6 V10:51:59 Message: 正在打开端口,请稍候...! w( j, Z: g( F; y
10:51:59 Message: 端口已经打开
, z7 o( H4 ~- j9 O  W0 K( {10:51:59 Message: 正在连接网络设备,请稍候...- O3 I4 h- T3 W6 w8 C
10:51:59 Message: 网络设备连接成功! a* Z6 K% x- d" w' @- z$ x' D- A: ^
10:51:59 Message: 网络设备已经准备就绪
% Y- Q* ~- F9 h, P: a0 L! L10:51:59 Message: 正在验证用户帐号和口令,请稍候..." `! B3 B2 P1 ?% F% v" r3 S6 M! Y  h
10:52:00 Message: 正在接收验证/授权过程通知消息
6 a+ T6 [/ v0 \, o; t10:52:00 Message: 正在与服务器进行数据交互,请稍候...% Y" G' N0 o$ i7 ~  M
10:52:00 Message: 正在接收验证/授权过程通知消息4 {! C# e! n3 ^+ S
10:52:00 Message: 交互过程结束. T6 |/ a6 ^& |0 H( G, H+ ~
10:52:00 Message: 正在接收验证/授权过程通知消息. y- L2 Y) r9 K; F
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
9 T% e& c1 \. V3 k10:52:02 Message: PPPoE连接建立成功( ]5 B  ^: T! L: N7 w' F
10:52:02 Message: IP -> 192.168.0.2
" P/ L6 w$ b+ z" u10:52:02 Message: IP -> 218.109.100.70
- x$ _! K" p5 n  V* `4 R10:52:02 Message: IP -> 218.109.98.169/ n1 b# V7 h. e! n

6 Y* Y8 B% Y5 ]/ }7 z5 S给一个实例的代码好吗?$ T+ Q2 I& v: J, ]
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。" m3 X& C+ n9 E
我没有编写过ppp之类的软件,没法给你一个实例。7 J( J/ p. ], K1 J$ ?9 ^( N: B
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。& i) ^  q$ F9 T
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
$ h; U& C5 _! S' d

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:" J" r( T5 Z6 ?
我没有编写过ppp之类的软件,没法给你一个实例。( I" X0 l4 Z2 X( R; V/ ]
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。/ \% Q$ [" M/ j
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
$ @& y" a" |. L4 O
% v# R" R6 d0 M1 [- O1 i' K$ p1 d& Y5 v+ @

1 b: q) d; r5 Q! c9 h6 O0 F4 ]! Q: d很可惜,真的太可惜了。
- S* q  G- L$ X& `5 t标准的拨号只要调用几个简单的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
( N" z0 @/ e' _0 `& l+ s% a( T4 x% R3 v) q
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息! D1 w* u2 J" Z. e
& J3 g; B- z- [+ }4 C' Z) k
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
- [% y3 J. O6 E0 s有一个RasDial拨号函数的定义如下:2 Z  [9 W8 `% \( S- v- T6 Q4 N  M
DWORD RasDial(
: g5 h) B! |- Q5 JLPRASDIALEXTENSIONS dialExtensions, 5 H7 |: p" ~+ Y6 T
LPTSTR phoneBookPath ,
' K# {  y6 q+ O! Y* A, oLPRASDIALPARAMS rasDialParam , 7 b+ M) O5 g' o2 _3 X
DWORD NotifierType,
5 R; a& I" E. M8 C9 ~1 ]LPVOID notifier,
# Q2 J" {% p9 ^& M& K6 MLPHRASCONN pRasConn );5 k& r# u5 X7 p2 b/ C5 c

+ O. \5 W! `' G- E3 }我的MSDN的解说如下:- x7 f' |, i3 ^. w1 J$ U
Parameters
9 s; x! ^# M- N- |) v3 L$ \; d8 ~$ pdialExtensions
# x! D. H2 I7 o9 e. s6 }This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options. - v, u$ M0 q/ q# N8 b
phoneBookPath
2 \% x8 o& k9 I% G- e+ E) KThis 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. 6 p3 t, }" y' s4 ~
rasDialParam ) e4 V) X6 J& A/ [# H
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
% v) s7 y5 w4 e6 tThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. ' H' c8 b* P9 j/ R: _* ^

0 y# {1 t$ D. P9 b4 ENotifierType 7 j1 Y2 G- W( s0 v. \4 ^6 T
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: + {; S3 C8 f- o6 G- [4 a8 |
Value Description 8 A0 }+ H' {/ f$ h
0xFFFFFFFF/ ?/ K, H1 |# E6 Q3 v
0xFFFFFFFF 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.  
) U9 ^( `2 v, `- r" ` The progress notification message uses the WM_RASDIALEVENT message code. 2 t; K. v2 K4 Q6 M* I
- L8 L/ p7 Y( o/ J: B& E

: }0 K) a* ^; X9 ?/ X: d* S, D7 ?  C( }% y0 i4 k

) B% x" o( Q" J+ ~: p! h) Cnotifier $ I2 @4 o) ]8 r7 G$ N5 \0 I" L5 k
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. 2 F! ^6 I: h# R# F: d0 v' l
If notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
2 c, R8 Y1 {9 Y) j, c8 \' {( H- Q) 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: . @, ~1 o% j9 p) x+ V2 ?8 s

, x7 T1 L5 a6 ^, X. T# v# O2 O+ MThe connection is established. In other words, the RAS connection state is RASCS_Connected. 8 n! p+ l4 G  {5 p3 @- w  K
The connection fails. In other words, dwError is nonzero.
% j! m, b6 w, \6 JRasHangUp is called on the connection.
# L% p1 Z/ B; ]5 z+ ^- T! ^7 L8 _The callback notifications are made in the context of a thread captured during the initial call to RasDial.
( I* j1 M4 h- l% _9 F9 @3 V. q% m8 k/ q: v& ]) w
pRasConn
( {; L& G$ i2 R( `& c" aPointer 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. # _* r  M1 W6 |4 |0 A
Return Values
! p- e. I( [% z5 q0 x, A9 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. 6 G5 D8 s, M/ l) S
, i# w3 C2 K' J; r: U3 @
Include Raserror.h for definitions of the RAS error codes.3 V3 C" C, N: }3 _* F7 `

6 J, x' [% d9 }6 M0 ZRemarks
# }. D' P/ @! N3 {& lThe szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.
/ T# b' Z1 m/ U. G. \$ `# S
, p  M, t  D: ~$ 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.8 R+ [; R% Q7 Z, m
, n7 j/ g4 F0 D. i; o9 E' f
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. * w% k' F" ]8 U" }) l4 \

8 T) X7 H2 f' J( bAn 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 _7 t1 `1 H/ m( A7 W( s$ p/ g( y: Q: e
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.
* ]+ k! j7 v" ?* q: ~" X+ p
5 T* I. x0 K2 }4 B) nThe 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. 6 N$ p7 w( k2 ]: K3 `/ D
# l$ L; o# `: S7 p7 r
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号/ p& n& L! H# _5 i* A
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);
) h. \5 N& d$ `: H( _第五个参数是个回调函数,一般都定义如下:9 o" H4 V$ E) Q( u
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)5 r7 c: T/ ^/ k, i* r+ T9 t. O
{' O3 U& m" \3 b/ [7 _, B
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;+ o; _) E9 \: }: j  s1 i+ I: c
        ' H6 x; ^, p+ P0 ^5 `! N
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
1 a% Q: I" [# q2 V% _; W}
6 M0 L% h# s* t' I这个回调函数将会把拨号的状态POST到各个窗口句柄。
* D. b" i, d4 B* n$ V! p
8 Q1 M% K- S$ i9 X8 H8 D

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃
# s, b/ ^2 Y9 s! I  x) D" o
& ^( o& d' q4 d% T8 P
/ G! F, B4 k# A- w$ J- Z/ k在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出
) Q) t# a3 L/ J3 X! H5 X10:51:59 Message: 正在打开端口,请稍候...
, k- m1 T, B3 h9 m10:51:59 Message: 端口已经打开0 N4 A  s4 X7 o6 I4 V4 E
10:51:59 Message: 正在连接网络设备,请稍候...
9 I+ M; }8 S# H# x2 I& s10:51:59 Message: 网络设备连接成功
& X; H" ?* L: F1 {6 [10:51:59 Message: 网络设备已经准备就绪9 r! {4 Q: [# E, P( b' e
10:51:59 Message: 正在验证用户帐号和口令,请稍候...; A0 `& j, Y7 ~$ V0 I
10:52:00 Message: 正在接收验证/授权过程通知消息6 I6 Y1 }; V6 Y
10:52:00 Message: 正在与服务器进行数据交互,请稍候...- I' ?. a) `7 `; X
10:52:00 Message: 正在接收验证/授权过程通知消息
8 _) k% j  f, @4 r3 Y6 S$ Z' y10:52:00 Message: 交互过程结束
& a/ `1 _/ ~& ?8 h+ C) p10:52:00 Message: 正在接收验证/授权过程通知消息
) g. p" S4 p* g$ D8 Z: f10:52:00 Message: 用户帐号/口令验证通过,正在建立连接3 Q. w9 O: [4 L' {; g
10:52:02 Message: PPPoE连接建立成功
0 k# P0 e+ ]3 g10:52:02 Message: IP -> 192.168.0.2
7 z9 X$ n% q/ G; h) e10:52:02 Message: IP -> 218.109.100.70
. A8 k2 l8 s+ d/ v9 W10:52:02 Message: IP -> 218.109.98.169
, A! F* j3 v+ m* a) w6 Y. N
2 F: w* {% t" d) _

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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