下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。+ a0 G! r: w+ [
想编一个程序,实现类似于网通拨号器的功能$ a! [2 f* Y; F& H1 p
3 E4 w  A6 f& Y8 a4 Y" p0 {! S
10:51:59 Message: 正在打开端口,请稍候...
( D, \; v1 t6 V! M10:51:59 Message: 端口已经打开1 _3 _/ x3 e, s
10:51:59 Message: 正在连接网络设备,请稍候...
) O/ Q4 c. x: l4 `* w) l& D10:51:59 Message: 网络设备连接成功# h' k1 X: j" p7 Q5 a
10:51:59 Message: 网络设备已经准备就绪
# Y, O- |+ |: `) Y* s9 p5 z+ r; }7 u10:51:59 Message: 正在验证用户帐号和口令,请稍候...
4 V+ A) w" A$ E; U3 @7 `+ o10:52:00 Message: 正在接收验证/授权过程通知消息
' T3 G4 k2 C! R7 O. a, U* s10:52:00 Message: 正在与服务器进行数据交互,请稍候...$ B. Q& s- y5 D* e3 N# U. Y( j
10:52:00 Message: 正在接收验证/授权过程通知消息8 U# D' L2 z, V% e; T) a- c" U
10:52:00 Message: 交互过程结束
$ L0 @5 e! I6 P10:52:00 Message: 正在接收验证/授权过程通知消息
3 r! O" d: [* d" T! L10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
# `. ~' Z+ j0 k4 v3 c* Q10:52:02 Message: PPPoE连接建立成功. u2 R& I0 V) O0 F
10:52:02 Message: IP -> 192.168.0.2, v8 t" n7 g: O* a$ K1 b
10:52:02 Message: IP -> 218.109.100.70, r% G7 s' x6 M9 Q; A
10:52:02 Message: IP -> 218.109.98.169% M0 b( n' d3 T( H8 Q. ]( w% S; N

. v. e# I6 i. N; V% R6 W1 S  K给一个实例的代码好吗?$ b" z" ]! u+ J. t0 @9 W; i3 w
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。; k8 N- N; h3 q& z
我没有编写过ppp之类的软件,没法给你一个实例。
) {3 l9 o/ ]& n' P" h/ G4 b我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
- ^5 u6 K, f! N1 H3 m. q! }$ t标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API! F% n$ Z" N3 {6 w

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:7 e# P  S* @7 i0 n* Q
我没有编写过ppp之类的软件,没法给你一个实例。( |0 x( W3 P* D, _# U) @3 o) O
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
' H1 }# G: z8 G- O" ]& y$ X 标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API3 V  @1 A! q+ N/ Q  B& j6 y. q1 F9 F/ {
2 K; X- E' H0 |4 x% ~1 g7 G3 l
3 a7 v' E1 D1 ]5 p: p4 f" b6 \: l
很可惜,真的太可惜了。
' H& q7 O' \6 C! }* I/ ?6 K1 q$ D) C标准的拨号只要调用几个简单的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) connections0 A7 Q3 W% V- Z6 X

# q) i" q/ ~# D& Q是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息
, J% X4 t$ M& F1 P
* F( V" Q; Y& d" i: i" r; Mhttp://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
; ?* ^/ P4 J: h# P+ P有一个RasDial拨号函数的定义如下:, E  f- `# g) M& n1 n
DWORD RasDial(
; V: {' Y+ A2 a" cLPRASDIALEXTENSIONS dialExtensions, $ A6 X7 b( n7 M# V' q+ {3 A
LPTSTR phoneBookPath , 4 ^4 U+ C- q  n  I1 \% s# O2 n
LPRASDIALPARAMS rasDialParam , 7 L$ o3 F6 C' w+ ~8 |- O
DWORD NotifierType,
# \/ Z. q' Q0 V, e# K8 M3 _4 s. oLPVOID notifier,
( F2 I" t$ ?0 A) e: g( l8 ?: k8 ELPHRASCONN pRasConn );
) o4 w, q: Q$ H7 w, u' a' P7 Q' A6 X$ k  z$ N
我的MSDN的解说如下:
) y1 s8 i7 J1 l4 c+ o! gParameters: i% C% ]6 D, H' k! n
dialExtensions - x& h, f7 p  }. c
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
4 m! n) W1 L* `6 m2 R6 sphoneBookPath
: x! j; ^' G! h5 @# c3 lThis 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+ T3 w; H% IrasDialParam
5 m; s. U8 N" {) ^Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection. 6 P. M6 M5 K, ^( e
The caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. ( Q( I$ j! E" g# l

8 b- V( M) R# ONotifierType
  m; N2 v; n: f" s1 Y! X- @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: # S! B; F( }& P5 a6 \
Value Description
1 B% Q. i2 M! M7 f, ^! @! L" T0xFFFFFFFF! i% B6 n$ v9 P$ S5 G% q
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.  
- N" v! z; o3 Z The progress notification message uses the WM_RASDIALEVENT message code.
9 D9 F" f: Y8 Y& F, i( ^% C0 T# I
5 z% C3 y( H% _2 B6 F" V- ?8 ]: {/ z; e7 b2 L! x0 s+ u
$ w! k0 v& ]/ _1 H  m9 @# |4 \) O

* R7 O+ ]% `8 ]: e9 enotifier
' e& `6 ^( J3 RPointer 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.
  x+ B- k# b; V- f7 l5 I9 E$ bIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
0 m+ @9 u0 Q  L4 w$ u8 \- h) M
% g+ B( W$ A% ~! {& 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:
% S0 a% A. G( r( ?0 X! N9 u& t
% O! X1 O4 i3 {+ \( N8 VThe connection is established. In other words, the RAS connection state is RASCS_Connected.
8 W9 _* O9 {/ t- O! aThe connection fails. In other words, dwError is nonzero. 8 {% _: t  S( Q7 w8 l3 Z, Z
RasHangUp is called on the connection.
9 y/ @/ ?0 ^3 C& v3 Q; H* vThe callback notifications are made in the context of a thread captured during the initial call to RasDial.
6 V: \0 |5 s  z8 k
0 O# |8 a( P% C6 @9 A! ~8 a6 spRasConn * a9 F, @8 x! z! ^. D$ o% ~$ ^+ p9 T
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.
! W. I3 m# G4 w3 |* @6 w( QReturn Values
9 P( V7 g% _4 U7 J3 t7 CZero 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. - s' z6 V: p8 k9 u  J
% W6 C  u  p- ~
Include Raserror.h for definitions of the RAS error codes.4 q9 z! Q) @# V1 N, \

5 p+ j+ H8 m" h4 c* yRemarks
, z$ ]' l( g# w. R. ZThe szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.
' k, h$ l/ X! {# ]6 Z$ \6 ?5 x8 h2 s9 |7 [% I
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.
! S6 [3 ]! o# p# N9 x, E) g8 _5 n+ f+ I) o
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.
6 o# h1 W% P+ l) r  _  k
' R! f. C2 Y% X, `9 a5 ]An 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. : b/ @" k1 u9 i) e, s) E

7 R5 h1 D0 H: C, E# T7 [" j' TAn application can safely call RasHangUp from a RasDial notifier handler. If this is done, however, the hangup does not occur until the routine returns.
# \+ r$ e  [  }# l4 o) f( c
9 ?! N9 {$ Y# }+ }- |  mThe 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.
) X3 Z$ _+ ~, O  `
' S- [0 _  e* x$ N看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号& q# q0 a/ T2 U/ q" ?% ^9 `
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);3 A7 r& P* f/ k$ e& \. H. X
第五个参数是个回调函数,一般都定义如下:) Y' O  z9 h9 P  w" j
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
! t% _3 S$ _) @{' C8 }, V. A# ]5 {
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
2 B& g+ C+ h" ]& p/ b4 M        3 h& v8 L4 S/ u
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);; C& d9 e* E& M* k8 n0 v$ E" y) u
}
+ @# k# R: T% y这个回调函数将会把拨号的状态POST到各个窗口句柄。
/ H0 }4 X# _3 n" C+ C5 u, ]: l2 t4 y
% l9 ^! [9 B+ t2 }

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃
! c4 U+ R0 G$ s  T& G4 y4 \
: i) w4 n8 z% f7 m- T( t  @/ a, h) O' w$ W- W+ M8 {* {, E, @
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出
- D1 N, k. L3 r10:51:59 Message: 正在打开端口,请稍候...
; }, O( P1 M4 t: i! d( J4 F10:51:59 Message: 端口已经打开. e; i" B0 ?- w3 c& G2 K1 \
10:51:59 Message: 正在连接网络设备,请稍候...# E+ o/ P( w- |1 g8 Z: a$ a
10:51:59 Message: 网络设备连接成功
1 v: l" n4 k' J5 t" `' b; z' G10:51:59 Message: 网络设备已经准备就绪
4 _" ~1 S$ S& r% x0 b8 J3 u10:51:59 Message: 正在验证用户帐号和口令,请稍候...
# F; M! e8 n* k10:52:00 Message: 正在接收验证/授权过程通知消息* W9 r5 E8 a- N5 @2 Y2 P% G5 y+ L( J# C
10:52:00 Message: 正在与服务器进行数据交互,请稍候...! }0 k( u+ x$ I: b' [
10:52:00 Message: 正在接收验证/授权过程通知消息* C6 c: h) Q* N+ l
10:52:00 Message: 交互过程结束
( W2 ~5 L6 D8 v, J) g+ D! z: T10:52:00 Message: 正在接收验证/授权过程通知消息
2 b" g& j) n% u2 H6 R# [10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
7 a2 E- z, c& C. i10:52:02 Message: PPPoE连接建立成功0 Z+ c: q. s. F6 H
10:52:02 Message: IP -> 192.168.0.25 v' g/ y" \/ `
10:52:02 Message: IP -> 218.109.100.708 O5 B: o7 b/ \3 G" [2 Z( j9 _
10:52:02 Message: IP -> 218.109.98.1696 G& p; v0 j( O" ]: U7 o

6 z; s/ N% a8 h  a6 [

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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