下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。
# P+ ?6 A: f- A( z想编一个程序,实现类似于网通拨号器的功能
- E- w! n3 z1 C! j& G  c* d* i7 X
$ j+ n2 p7 [% D# t1 C* B2 v5 T10:51:59 Message: 正在打开端口,请稍候...
5 S; C7 ^% w+ s/ R8 I$ p: {- {3 m10:51:59 Message: 端口已经打开
; u% ?! @$ C' f" _6 I1 N; Y10:51:59 Message: 正在连接网络设备,请稍候...
1 P. o$ C: [; E2 B# m7 r10:51:59 Message: 网络设备连接成功
" S2 Z: ]/ j2 i7 j10:51:59 Message: 网络设备已经准备就绪3 D0 I- ~( ^" D( m& Q; x* {
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
9 Q6 T7 {, \) |7 z  M/ \. J10:52:00 Message: 正在接收验证/授权过程通知消息
6 X% _. r3 V8 ]& H* }' S10:52:00 Message: 正在与服务器进行数据交互,请稍候...' Q& X. T+ H* ?9 D
10:52:00 Message: 正在接收验证/授权过程通知消息+ A. Z; X7 V9 D
10:52:00 Message: 交互过程结束+ U+ c: R; o  ?
10:52:00 Message: 正在接收验证/授权过程通知消息9 D$ S) R# d6 _* h# P; L3 T! a, w
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
2 P' G0 M5 N* a# `: I10:52:02 Message: PPPoE连接建立成功
: m6 s" @0 M0 @! A' O& k; G5 p10:52:02 Message: IP -> 192.168.0.2
7 g& Z6 G4 K  ^3 l. S10:52:02 Message: IP -> 218.109.100.70
3 J9 r: j9 u& Q5 c: G3 e10:52:02 Message: IP -> 218.109.98.169
, a( E! _- S6 x+ {+ q. E" B; L
: u1 r4 g  w5 G: d6 f给一个实例的代码好吗?  o" p/ q/ l4 x, B
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。3 M# A4 C; r3 ^( f
我没有编写过ppp之类的软件,没法给你一个实例。
, ]$ q" D' _1 |8 `6 ~我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。+ Y9 n0 o! X. Z7 b; w4 r% M2 G
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API" j0 X- B- i8 r+ o2 ~+ }$ Z

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:$ ]  ~$ d$ Z  u% u  f8 d
我没有编写过ppp之类的软件,没法给你一个实例。
/ c- Y& ]# B% h' ?- Q' k% \$ D 我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。7 R; r- W  k  q5 T
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
" o1 S8 N, `, E" f5 }% [. D

/ [' O2 X3 m% c8 G8 i; Y2 d/ o- a
很可惜,真的太可惜了。
, U1 c- |2 e3 q; A, Z1 y) s标准的拨号只要调用几个简单的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
4 c' I2 C) j' C5 z
# s& a* @% l- n2 K, X& L, l# d7 M# F* e是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息9 S/ ?* B! l1 [5 H# S" F+ u
4 _/ f+ [4 Y9 R; n& F1 {8 |) ]6 P" i
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。$ q$ f) [$ A9 J$ k, a4 n* O6 W
有一个RasDial拨号函数的定义如下:$ ^" Y/ y" e, E6 n, ~3 h1 w
DWORD RasDial(
% c$ R# \1 [3 W! WLPRASDIALEXTENSIONS dialExtensions,
% R  U$ ?8 G( SLPTSTR phoneBookPath ,
. h# A% y# U# h" i/ X2 V/ W) @8 NLPRASDIALPARAMS rasDialParam , ) [0 I' t% L: x
DWORD NotifierType,
7 R, E( z/ R3 m9 T  q0 h) V6 V$ BLPVOID notifier,
& }6 n5 R; z+ a: b7 ILPHRASCONN pRasConn );, E7 q; L3 c4 c( b( C' k

4 d5 v9 U( A2 q+ I$ O3 `; F. |! ]我的MSDN的解说如下:
! g1 P/ _" k) x8 iParameters
1 H" h# O9 Z3 E- W& UdialExtensions 2 j* G& g5 L+ i
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options. 2 q, U3 g& ~2 P( m* |7 |1 X9 h$ b0 E
phoneBookPath % q" i6 B2 T5 N. ]
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.
- z/ b/ R& b8 C6 @" grasDialParam + N' I6 h! d3 U' H6 J1 Y) e: ?
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
: m2 }2 t7 X6 C8 jThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed.
( W8 c" l5 b  l% I+ [
2 o5 Y  _8 P; y; }+ o$ l1 UNotifierType . l6 d: R! Z2 X2 j" ]
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: " z% b% {7 U0 k" ?6 s
Value Description
! P! E' C% ~, H" K; _0 _0xFFFFFFFF- Z9 L! R  d4 A5 G* g' w" l; p
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.  5 F3 S% t9 M! e( _. \# n  r. X# J
The progress notification message uses the WM_RASDIALEVENT message code. 6 e/ }5 X  q1 @5 i9 ]" k  a
0 p1 X( Q8 F' c! {
8 c& f; f* \* c  k

# |+ P9 D" V- W9 I4 Y; J+ {) o) d3 f% z/ \& ?  t, B: i
notifier % U' ]; [2 q" N$ f
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 b9 m' Y
If notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
2 F# C' j* x4 _2 W
7 ]. e' i$ O- a; D& d7 T& zIf 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: % Q+ x: M5 N* p7 U' C9 Z

8 x3 D1 W9 O& s/ aThe connection is established. In other words, the RAS connection state is RASCS_Connected. * V$ C8 i, y/ l; F
The connection fails. In other words, dwError is nonzero. # i3 `$ }/ F- K
RasHangUp is called on the connection.
8 Y, V0 C! E: I9 J; M' pThe callback notifications are made in the context of a thread captured during the initial call to RasDial.
6 V1 g* K/ e$ x0 Q! E3 G& F" w
3 }, t/ A% X2 l9 [) _( E9 V2 i4 NpRasConn
9 p9 R/ k& T5 s3 P7 Q4 `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. & F; p3 b) t# k/ r1 `
Return Values
9 H4 O. }1 j" Z+ 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. 1 c8 \0 L% Y6 L) B9 T& w

0 `! i" d8 }3 S; CInclude Raserror.h for definitions of the RAS error codes.
/ z0 F( [# O+ H0 D+ o' R' {
* E5 m- r* p0 c/ V3 i( Q/ [Remarks- O3 z' j8 L) m4 {. o5 e
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.. x3 k* Y! y; F+ }2 R
9 N! f5 y8 C1 u3 V8 _, H+ ?5 B
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.
  u7 Y) y$ Q8 W0 f% h* q# p
: G" q+ G0 o, i0 p6 E% Y& E/ Y/ NErrors that occur after the immediate return can be detected by RasGetConnectStatus. Data is available until an application calls RasHangUp to hang up the connection.
  u' Y0 z! A2 X9 ~: ^6 J
1 W3 }. Z  g: A! DAn 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( o& \. [' k" D

$ H9 H2 j7 t% u6 H8 K# DAn application can safely call RasHangUp from a RasDial notifier handler. If this is done, however, the hangup does not occur until the routine returns.
8 M4 ]' M, [3 C3 t' q# q$ y, e* r. \; J( U% w2 Z8 O+ W/ ?9 P
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.
# f# A+ l- Y  w& I: P4 Q0 j/ j. b# w# U4 P" }! D
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号
: _1 l  r7 w0 `! O% ^DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);
( A# K$ H$ V: i& u第五个参数是个回调函数,一般都定义如下:& X' e9 Y7 s8 ?5 c
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
" p0 _5 H8 d, b$ L2 y* U) Z& }{+ x- X) p" d7 D7 P" d2 n, j
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
7 k, P0 F- J8 \        ( N. x' r- L  D7 r9 G
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
2 O  ^) C$ e1 Y: @. T- ^}$ Z8 A1 w' t7 R: l) q9 x5 k" h% a' t
这个回调函数将会把拨号的状态POST到各个窗口句柄。
$ y3 S  S* P5 f3 [3 I( K% j1 q, a0 D- t& U) C  N

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃
4 v0 S7 q$ M2 f1 a+ V9 d! k. B0 V" D2 _" |: M/ p2 V
3 `5 P# T5 I/ i- h- I' L) p
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出
, |9 s- m9 k. i+ G5 F5 j10:51:59 Message: 正在打开端口,请稍候...1 H) Q7 U- M3 {% ^5 w+ }
10:51:59 Message: 端口已经打开
5 m0 Y, ?+ j1 p10:51:59 Message: 正在连接网络设备,请稍候...
1 y/ ~2 a6 e2 K0 H10:51:59 Message: 网络设备连接成功
  T4 h& l0 l/ ^% m10:51:59 Message: 网络设备已经准备就绪
: M# C# _5 w1 {* r: \0 V10:51:59 Message: 正在验证用户帐号和口令,请稍候...
/ j' _0 c9 O" w* r4 k$ O10:52:00 Message: 正在接收验证/授权过程通知消息
3 T# f$ o% t' V) G6 v( V$ l10:52:00 Message: 正在与服务器进行数据交互,请稍候...
; L' I! H4 [0 ?6 y8 Y4 j# M, s3 z10:52:00 Message: 正在接收验证/授权过程通知消息; U+ s+ g: w7 U8 j
10:52:00 Message: 交互过程结束1 U$ ^5 d, v1 l% U. T
10:52:00 Message: 正在接收验证/授权过程通知消息
4 d% L  _, I7 W( j10:52:00 Message: 用户帐号/口令验证通过,正在建立连接! R1 h- M& D* F) P
10:52:02 Message: PPPoE连接建立成功
' d- E9 Q: A0 e& N2 \10:52:02 Message: IP -> 192.168.0.2
" n7 _3 Y% m9 ~10:52:02 Message: IP -> 218.109.100.701 `8 O2 v. U$ t# A1 i. h
10:52:02 Message: IP -> 218.109.98.1694 M: h' l. h/ }% D  J

: w2 C, p1 j7 D& n7 L5 K; r# h

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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