下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。& y& n- A* [& Q
想编一个程序,实现类似于网通拨号器的功能- b7 W( j' }! s

/ E" K. S9 Z- m8 D/ Y; @5 l: ]10:51:59 Message: 正在打开端口,请稍候...1 w0 J4 t* s/ z
10:51:59 Message: 端口已经打开
& N7 u$ W" d- M/ _10:51:59 Message: 正在连接网络设备,请稍候..." U$ Y3 ^+ b" y2 [$ @+ e# l
10:51:59 Message: 网络设备连接成功
4 _" {6 [' `' z. n  o' ^10:51:59 Message: 网络设备已经准备就绪7 O2 |# H0 r) U: m- G, E1 x
10:51:59 Message: 正在验证用户帐号和口令,请稍候...6 L* }/ l; {! K
10:52:00 Message: 正在接收验证/授权过程通知消息
1 R3 c) V: q' y6 ~) U10:52:00 Message: 正在与服务器进行数据交互,请稍候...
* |4 M- ]* b0 T( w+ ^4 W10:52:00 Message: 正在接收验证/授权过程通知消息9 }( o) _# I) k. _+ ]. k: y# O. q
10:52:00 Message: 交互过程结束3 f2 K! |8 |8 Q; H8 J8 T* a
10:52:00 Message: 正在接收验证/授权过程通知消息
$ c) M9 Q, E& X, c) ]- Z6 i7 O* f10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
# _5 z+ c" H8 |! g5 e  L& k, v10:52:02 Message: PPPoE连接建立成功" K+ k: p$ l: q& n
10:52:02 Message: IP -> 192.168.0.2+ J$ T! u0 y) t' U; J" `
10:52:02 Message: IP -> 218.109.100.70
7 s* e0 K3 Y, h) S0 ~- W$ r10:52:02 Message: IP -> 218.109.98.1692 j$ r# d' w6 y! E7 U+ \

& _& W' o8 e, o0 \4 @/ L; w给一个实例的代码好吗?
5 Q4 F8 w8 G7 W0 [. v2 |1 p) @我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。
. Q2 U3 p" i0 j0 T我没有编写过ppp之类的软件,没法给你一个实例。
4 ~6 A- V$ A; v2 d我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
) S& u, o) O9 S1 ^) `标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
+ J4 O% d8 m# o3 L6 G" s) [

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
" ?" V9 J: L; \$ k* [ 我没有编写过ppp之类的软件,没法给你一个实例。3 q; P) d* j; _" k- k# R  C
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。% f/ O' V% n- h
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API- V1 d' S6 l& |0 v

! [% O/ ^* I) \, M6 x. f) B. e& o6 D" q) i( L4 [
很可惜,真的太可惜了。2 P' j; X2 d: M, M- U7 Z
标准的拨号只要调用几个简单的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
$ {0 n1 a( l5 [/ T% Z% t& \( @/ K$ W# v) W+ Q
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息: w1 _+ b7 B; ?! r* p  j
& f/ i* T2 |7 {9 A4 P0 `
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
) R% @, s) x; B) N有一个RasDial拨号函数的定义如下:: @* m* k2 z* s% I
DWORD RasDial(
- K" N, n% R) L3 y0 x; D" U# B2 NLPRASDIALEXTENSIONS dialExtensions, ; \8 H# Q% s2 n
LPTSTR phoneBookPath ,
1 M" I2 ]! a0 FLPRASDIALPARAMS rasDialParam ,
# K1 G) S3 s  sDWORD NotifierType,
9 f+ n' x% M$ z# r! j7 kLPVOID notifier,
8 P9 S: E4 [; I  x# JLPHRASCONN pRasConn );, Q& w3 Q% }' Z5 U5 w1 P+ n
; A8 b5 z, N& j, k# I; b2 b6 l
我的MSDN的解说如下:
; h) ?5 L% z* O+ r2 y$ yParameters7 k, l! L, a0 ^. v% k" \! C# h8 x+ ?& O
dialExtensions , X' Y- x( J: o/ Z
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
$ g* _( N( s, XphoneBookPath ) ^7 J' G  w  i0 J
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. - y5 h0 c! I' ~8 n
rasDialParam 0 U  @9 W7 C) v. E; c0 _) Y* a2 ]
Pointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
5 m5 L' E! F1 ~- B1 W$ hThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed.
) `% z! O$ D. \! A0 }: i/ P. d3 V; F  T6 V
NotifierType
4 W, ]0 O3 V# q: {0 t7 W; FSpecifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value:
" A1 q' L- Z( V2 n7 W% \Value Description
2 ~/ p! R9 M' U# c( _* Q1 u1 q0xFFFFFFFF
0 f1 |$ @) F+ B+ q0 `3 E3 @9 h1 _) O0xFFFFFFFF 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.  
7 D  U9 A$ z$ i, q The progress notification message uses the WM_RASDIALEVENT message code.
2 E$ t+ t- `" n' O6 k  o0 ?3 e' l6 L2 k( U* U" w1 N, r0 B5 ^

1 f8 _2 ], v' w" T8 v+ |! i
7 k1 A* S7 w9 x6 v. m. _7 ?& f0 G
, M3 w; A9 L  Z* y& O8 {4 q. Hnotifier
# z5 Y$ u# N8 y7 ]( F8 \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. % n6 u$ i( L2 O' i5 S
If notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
! k- a! l+ y9 J) x* Y: S7 ~$ U. t# h( N  e8 P# Y% v/ |' I9 R
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:
! G/ p9 |& O  f$ T) \
1 k3 _5 B' ~' {- g9 F; nThe connection is established. In other words, the RAS connection state is RASCS_Connected. 0 A, Q* f4 T. P5 h+ M+ I% Q
The connection fails. In other words, dwError is nonzero.
4 C2 S9 {" N+ eRasHangUp is called on the connection. $ U* v. z6 X( ?5 v1 c  k0 a
The callback notifications are made in the context of a thread captured during the initial call to RasDial. ' Z  G, q0 i. O4 P
8 t2 e/ [& [* h  {$ S
pRasConn " X4 I7 x5 y/ Q% v8 c
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. 5 N0 |5 ~) U) V& h, }) v
Return Values
) u* I8 ^  K* 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. ! E4 Q' n7 e# A1 R: m. ~6 m4 D, B
- ~2 ?8 N/ [2 c+ h/ u# R% k' Y( p
Include Raserror.h for definitions of the RAS error codes., h1 L. ?* D" |9 o3 `* ?, v
- d  t. `! D( R% @1 [) f* Y
Remarks; k/ x! b' L. U; o' ?0 q% ^" g; H
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.
2 x# b9 q$ h# v) s3 Z0 }$ ^$ e) M4 q: d. Z, ]: }6 X0 F& ?
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.( M. e" a! V+ C* m2 m
6 E% k/ n$ W, W% z4 d
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. 7 c. w  R! c. I- W

, w) J$ c/ y  J! {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.
' ]* G" Z+ K' p, g- M
1 d/ [  K7 V' n8 H2 |2 {* K% xAn application can safely call RasHangUp from a RasDial notifier handler. If this is done, however, the hangup does not occur until the routine returns.
7 K* H8 y; M, S+ c
1 P7 W, k0 M6 m7 F/ d- HThe 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.
3 @0 O* F, X7 f1 v; i. O! H( h  @) _
3 }" M! ?% K0 F' F( \: y1 ?! y5 ]看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号1 ?% T, H8 e: e9 M
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);
7 }8 N* L7 v* r+ q- c; a第五个参数是个回调函数,一般都定义如下:! N$ [; K3 S! ?4 ?! e' a
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
) Y$ p3 j  {6 t$ z- i! v6 a{
" P. z/ a& J0 e        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
+ F# @8 a  k9 ~" a& z1 c: q+ F: M1 D       
) V: b9 _! R9 t6 {1 e1 M  l' ?        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
5 d1 ~# b; o" D' ~}( o, ~7 ?" Q7 ~* N" w1 @9 \; d
这个回调函数将会把拨号的状态POST到各个窗口句柄。6 M2 z3 j$ ]6 s, u+ z4 F

$ @  i& v) M- W5 H( j+ ~- `

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃- E2 [2 m* o9 o2 s3 ^5 W! [
) a' M+ @3 {) b1 r, A
# x7 w' Z: _$ q& ~  t6 J- X( c
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出
! Z) \1 q4 f+ s0 o; \, d10:51:59 Message: 正在打开端口,请稍候...8 {( Y& ?' w( Q$ A
10:51:59 Message: 端口已经打开+ ?0 w0 B9 _/ F5 @+ n
10:51:59 Message: 正在连接网络设备,请稍候...( L% A$ S3 y* \7 y' L
10:51:59 Message: 网络设备连接成功
4 R; ?9 X# c4 _10:51:59 Message: 网络设备已经准备就绪% }4 j, y' l8 f
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
, [  E- Y, I; v' x2 A$ I3 ^0 L) g0 z10:52:00 Message: 正在接收验证/授权过程通知消息
! Z3 |# x4 l* q  L10:52:00 Message: 正在与服务器进行数据交互,请稍候...
8 Y9 Z& U4 z( k6 {) j9 `10:52:00 Message: 正在接收验证/授权过程通知消息. [9 T' \4 x9 k5 B+ i5 n- u1 _# J
10:52:00 Message: 交互过程结束3 O* z0 f/ L" K$ {. [& b+ ?
10:52:00 Message: 正在接收验证/授权过程通知消息* Z9 `4 x- b1 W) C& S+ g4 Y% H7 `
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接8 X# {6 o& W8 M) @* d
10:52:02 Message: PPPoE连接建立成功
1 ?8 e( B% I: {- y10:52:02 Message: IP -> 192.168.0.2
" C  B" q0 I6 |) ?$ M10:52:02 Message: IP -> 218.109.100.70
# g( A$ |5 {/ e  }+ Z  s; }; z4 X10:52:02 Message: IP -> 218.109.98.169, V2 u& ]8 v8 U+ A$ N* N

% R* V( D* r- z0 F1 }* e+ ?

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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