下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。
8 L- p; t' I3 {3 n4 }# |1 a, X想编一个程序,实现类似于网通拨号器的功能
, x) v* V/ U9 c$ M* b; a7 r
5 Z4 K* ^2 n- n+ H  S) v# f& V10:51:59 Message: 正在打开端口,请稍候...
0 H6 H2 T' }5 }% F4 I$ u' D& G/ K. ^10:51:59 Message: 端口已经打开
$ G8 ^! D5 e3 Y4 R6 a3 A' R9 f4 r& J* I10:51:59 Message: 正在连接网络设备,请稍候...
( l% L7 A$ R  H5 y6 x10:51:59 Message: 网络设备连接成功
1 }4 k% H* ~  `" k. u: N10:51:59 Message: 网络设备已经准备就绪7 q; }1 @* F! a: O* N' {
10:51:59 Message: 正在验证用户帐号和口令,请稍候...9 V$ r" d1 x: f- J/ N  P
10:52:00 Message: 正在接收验证/授权过程通知消息
$ b2 ], }  P! [' B( Z# ?: {9 S$ t5 B10:52:00 Message: 正在与服务器进行数据交互,请稍候...6 c" B1 V& Q0 U& X$ N1 W8 L
10:52:00 Message: 正在接收验证/授权过程通知消息+ z( O0 s* \' l5 t
10:52:00 Message: 交互过程结束! K, T. g. O# @2 ?5 {
10:52:00 Message: 正在接收验证/授权过程通知消息% b; {% z$ C8 g) {/ ?  x
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
7 H$ u* t+ {% Q, l; r10:52:02 Message: PPPoE连接建立成功
( \- {8 j) Q. k3 T9 k8 x( O! a10:52:02 Message: IP -> 192.168.0.21 m, I, V. Z7 C2 I/ U0 ?! W
10:52:02 Message: IP -> 218.109.100.70
9 w1 v5 l7 m8 L% r/ ^6 ?4 X10:52:02 Message: IP -> 218.109.98.169
; a( r/ s. M% r- Y( E9 y+ d  D) y0 [7 K; t( g+ W6 W- y* t
给一个实例的代码好吗?' z# f3 f- B$ @- ?7 I
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。, I% C* G6 h) f
我没有编写过ppp之类的软件,没法给你一个实例。$ B- {5 L3 _) c4 ~) Q1 O% u
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。% p8 i+ c' ^) ?, ~# Q( O2 g
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
4 a. [% B8 e4 T. N2 E; v( t) J3 v

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
0 G3 Q9 _+ w% d! q: n# o 我没有编写过ppp之类的软件,没法给你一个实例。% R. S3 k' E" L* E& W/ z2 c
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。6 y. V& i  a! C0 z
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
& z% s. |% d6 p! `/ X0 X7 O3 }: G

3 t% {( T/ o* D1 D+ `& C3 e$ u9 N2 e- m8 i, @' x5 \2 G+ O
很可惜,真的太可惜了。" l7 n  V. V+ ?( s0 \6 V" K
标准的拨号只要调用几个简单的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) connections9 J2 E# ^) D9 y* \7 }
+ c" b8 E& B+ l
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息' h, s1 A  a9 C  z, w
4 t( o: R/ m/ C
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。+ Q7 z4 U; X) d( n* ~3 r
有一个RasDial拨号函数的定义如下:) Q9 Y8 k: |  @% S5 y: W2 s
DWORD RasDial(
/ Z6 H% `8 v) sLPRASDIALEXTENSIONS dialExtensions,
9 y9 n0 F/ s. d7 DLPTSTR phoneBookPath , 0 I* S- e1 W3 B0 I$ j
LPRASDIALPARAMS rasDialParam , 0 k  T# p. ~$ m6 a- Y4 Z  |
DWORD NotifierType,
; I! I7 U0 k- M; V' R+ A9 u5 kLPVOID notifier,
+ o$ b0 H: V. _/ i7 B- s; d: d9 s( {3 kLPHRASCONN pRasConn );2 B% D- b8 n: [( A! @: b- M

1 a8 h% W% p- y: e- K7 M3 R* K我的MSDN的解说如下:
0 ]) \; j: V% E: WParameters
$ }2 [+ e4 _- r: _dialExtensions
. u+ I7 v, t- h( q: |( DThis parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
0 [( W) x! C: rphoneBookPath 9 Z- @/ s* R% ^8 W. B* _% j% q6 y
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. 1 q9 L0 \7 L( |. |' c& o' G
rasDialParam & J- @4 _! U, o; v
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
8 D7 B) ]0 t. @" G$ jThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. $ T1 a1 ^  b' f5 S$ W
+ {: R( U3 e9 I& H7 F  f
NotifierType
% C3 L: r: f6 DSpecifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value:
- ]- Q& E0 O5 l) O8 g8 [/ MValue Description
/ W. F# R' Z3 ?/ T+ {/ ~0xFFFFFFFF+ G  F9 K, G. L- o
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.  . ]# E8 T; B& O; \& y  g5 z0 b+ D
The progress notification message uses the WM_RASDIALEVENT message code. ' W5 \( P9 b& N9 ^: @

9 x" a+ V/ z9 I# ~. y9 y& J* b6 Q+ r. g5 C3 x" }

. g/ A' U; c0 n% c
# N- e- I& G* enotifier # U( A/ S+ x# Y% U4 u3 h8 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.
+ Q6 V& U2 M$ tIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed. ' a# m/ u  H: b
  V; a+ j2 j5 X4 j/ |. b
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:
9 G/ C( b! v; T+ U" D4 I9 k: \/ u3 z! b: @
The connection is established. In other words, the RAS connection state is RASCS_Connected. $ e/ K" m) v- @* D4 H9 o' \- b
The connection fails. In other words, dwError is nonzero. ; ]; w2 |) g0 ]) {4 _% p9 `+ H, `
RasHangUp is called on the connection.
5 V) S( A, q; O& eThe callback notifications are made in the context of a thread captured during the initial call to RasDial. # x7 f) ?( q' ^: c

- ^5 G- P$ I6 D* MpRasConn
' N. E% u; y' a9 f# gPointer 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.
* ], t8 k. [" f; V# L2 q1 GReturn Values9 y, n6 b% g2 [' R; |
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.
& k& I- E) @) z% B/ q. S0 c
, ~) d+ G$ U- S1 w& k" p  P: {Include Raserror.h for definitions of the RAS error codes.
* s2 Q9 F; s7 l+ z' w7 Q
; i) G$ O. W' @0 L- bRemarks
, L  v# x* ^5 a1 B7 ]3 cThe szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.
! m: |( n% l" ~, p
7 S. E0 `! @7 \; i6 lRasDial 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.
" i4 f+ i( H3 j) z1 n5 L! K/ h0 c  [$ y5 z5 h3 p, x5 g7 a+ K
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. 3 N7 m" y& v  C

1 P' l: [4 c7 U; p5 }5 w8 U0 NAn 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. " i: e1 A1 V  `
9 Y* x9 r) Q" h# G4 L  I
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. ! S" U1 T% ^% u) _% o
; c4 s" ]7 {8 _( f, s1 l$ W6 R
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. ( q3 e5 M3 F9 |) u- Z
% \, T5 |( B! F' J, B
看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号
. j, p% W% N" n* l& x4 a) ]( Z' gDWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);! j/ j; J8 T' z; _
第五个参数是个回调函数,一般都定义如下:8 \& ?4 U9 l* [7 ~/ N- g
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)6 I9 P: r; G, Y+ h
{: u6 E+ F2 v" k. A- z
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
8 m8 b2 \' ~* U2 p# f: p3 ]        2 L/ |1 d& N. Q7 _( K+ v
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
1 S7 y$ T; ]+ E, A! |) B+ J- U}2 n* M0 w& W- U& p) c
这个回调函数将会把拨号的状态POST到各个窗口句柄。' \  d: ?8 a7 U9 b% M
* x) l% t& l9 \; k

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃- ~- b! g$ d& p- C& O
8 L; }; w2 f& d9 s9 n, }
* Z2 b8 |, j; D' U; Q+ B
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出
! W& M1 R& B, K1 ]10:51:59 Message: 正在打开端口,请稍候...
8 |: a& L2 ?$ I: `6 z  ~7 V4 Y7 b1 T, ?10:51:59 Message: 端口已经打开; Q6 b( B0 ~1 Q' v
10:51:59 Message: 正在连接网络设备,请稍候...
  Z, w. i. j' L) r10:51:59 Message: 网络设备连接成功
+ I2 V* C/ ]* C4 k, n10:51:59 Message: 网络设备已经准备就绪
5 o$ [- P7 r. i" z* T10:51:59 Message: 正在验证用户帐号和口令,请稍候...
5 F! ^" [% A. m1 S2 H# k. H' \10:52:00 Message: 正在接收验证/授权过程通知消息1 U8 ]1 @% y4 t$ e+ `# T
10:52:00 Message: 正在与服务器进行数据交互,请稍候...* F5 T& _& _) z- d0 c1 P
10:52:00 Message: 正在接收验证/授权过程通知消息
  [, V9 r& r- c/ W/ q10:52:00 Message: 交互过程结束
/ z+ o( c. i" g' l10:52:00 Message: 正在接收验证/授权过程通知消息* Y8 P. ?! {; m& J$ J1 g. e9 l+ Y2 a
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接2 A6 z8 @% x, I; P
10:52:02 Message: PPPoE连接建立成功
9 x4 i* m5 z- i# \6 n10:52:02 Message: IP -> 192.168.0.2+ p' F1 z% g' u3 r, x+ F
10:52:02 Message: IP -> 218.109.100.70
5 P) ~$ Y: x/ g8 M6 {( H# q8 m10:52:02 Message: IP -> 218.109.98.169
8 u% B# x2 v# ]3 W" o' M8 p* I0 H- x% s/ y
7 e! M9 }. o6 H' W: L( X  O

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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