下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。
5 j8 j  Q5 E8 Q  v2 |& a想编一个程序,实现类似于网通拨号器的功能" G- j' r* ?) z$ I
# x- m( J/ n3 D& [  s4 M
10:51:59 Message: 正在打开端口,请稍候...
1 W- N& R) g* d; ]& O  M/ `- S10:51:59 Message: 端口已经打开
- K3 u) G. O8 s/ Q/ I4 L5 w( v10:51:59 Message: 正在连接网络设备,请稍候...9 `8 k& V0 K5 D, `/ [
10:51:59 Message: 网络设备连接成功1 b( B: A  q" l2 V9 T: H6 \
10:51:59 Message: 网络设备已经准备就绪
2 B; L; [$ }  l10:51:59 Message: 正在验证用户帐号和口令,请稍候..." E# w# E, E! Q0 j. X0 Y
10:52:00 Message: 正在接收验证/授权过程通知消息
$ y) ^0 h0 l7 v# X& M10:52:00 Message: 正在与服务器进行数据交互,请稍候...
) ]( C! F$ {- L- E10:52:00 Message: 正在接收验证/授权过程通知消息1 B& V& U7 h' r7 A- h0 B8 o% F  q
10:52:00 Message: 交互过程结束, @; |0 U, B4 p9 Y3 A% w% ~
10:52:00 Message: 正在接收验证/授权过程通知消息
$ ~( Y( l7 r% S10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
, t8 e7 ^$ s; \& _0 L. J10:52:02 Message: PPPoE连接建立成功
2 d* ^3 p. k% J10:52:02 Message: IP -> 192.168.0.2
4 D! M$ k: k& s+ q5 W) [# O10:52:02 Message: IP -> 218.109.100.70
% q% o0 C9 x0 @% P5 z0 G10:52:02 Message: IP -> 218.109.98.169* W* s6 d- F% [# @6 `9 E
2 I: v6 Y# Z. D0 s6 s0 o& P* \
给一个实例的代码好吗?; z. T1 t# {0 @% U  c/ Y
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。
/ D8 a& U  r! k* }7 ^  _3 v6 W: A我没有编写过ppp之类的软件,没法给你一个实例。* D" M- K' I- B
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
- K/ ~0 z# S0 C6 D7 m, s标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
( c+ A; a  N. j" e: U. F

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:
% }* b' @  P2 X; t5 l 我没有编写过ppp之类的软件,没法给你一个实例。/ q, P4 k5 n5 c' u$ d7 u2 c+ ~
我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。1 U1 c  _7 k$ P+ t1 p
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API* e& ~/ C+ f( j" @! _

/ r* `1 s( N% j  ]; `, f3 W4 r
% @% N$ n" M' a* w; i$ q很可惜,真的太可惜了。
; I) w5 m  Q  i) d& ]. l& v, `标准的拨号只要调用几个简单的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) connections7 V' f  J2 ]( U6 ]  J7 z
" E* K3 n2 b% Y% T$ A* p$ u3 C9 N3 c
是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息) ?  m& J8 N( F7 n, o6 X

$ z" S# T5 N+ C- R; u) F) `0 w+ ehttp://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。
4 w7 X$ G# r9 P. }有一个RasDial拨号函数的定义如下:
3 P  s/ n6 O! D. pDWORD RasDial(
3 H# d  N% ^8 b/ m* t& b( dLPRASDIALEXTENSIONS dialExtensions,
) Z' i( D9 L/ s  x& H" L2 ~LPTSTR phoneBookPath ,
! Z: n' S% y; @% KLPRASDIALPARAMS rasDialParam , / m, U$ H) M. S6 M6 P
DWORD NotifierType,
8 g6 e9 w. V0 ALPVOID notifier, 0 b  S5 R( [0 B9 i
LPHRASCONN pRasConn );
/ O- ]9 d8 @" q; j" _8 X
9 _6 N! M, e* L* R我的MSDN的解说如下:- y+ M" P, ~% v" T( ?5 l
Parameters
" @) T- W" u2 ^4 Y1 S) H& VdialExtensions 7 \8 a) _; f+ @
This parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
+ b( A0 g6 w) i& ZphoneBookPath
$ R5 Y( p9 `  b, GThis 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. 7 _7 y( M; d. ~0 u7 g
rasDialParam
# _4 K3 E! Z$ d1 l+ U3 RPointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection. 1 c  X. N: C- X, G
The caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed.
2 ?+ S7 Z' [' a& w! ?, t0 u8 t) W5 q0 M# a$ ~
NotifierType
) d- ]  h% Z3 D; P% o, U4 RSpecifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value:
. z1 B! ~! M. e6 pValue Description 5 @4 F$ z( n* v7 I2 a/ N* o/ k) y
0xFFFFFFFF
- M0 ~7 x0 z9 X6 F8 k* l' s0xFFFFFFFF 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.  
) T) o: ]- z& u4 x% }& S# _ The progress notification message uses the WM_RASDIALEVENT message code. - R( J( @+ }8 h; S
& B3 K9 w/ `" u( @3 d; c

1 L) c! N( H' L& e) U7 s* |/ a
; h) L9 g8 K) B+ N. P/ {' w& h% @$ E+ y$ P8 B6 W& e, O: F
notifier
: O5 Q! ]4 Q) F9 Y# E6 K9 DPointer 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.
" \7 ~. e! N; G* nIf notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed.
3 G2 ^3 \2 O% _! s( \
8 Z6 W& ?9 X+ ?* X# g0 FIf 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:
* S! n; W+ C' M% F
% c8 y$ B. U+ y& }5 W7 A. ^2 sThe connection is established. In other words, the RAS connection state is RASCS_Connected. $ ?! d9 Q7 F6 J$ w; _. [3 H
The connection fails. In other words, dwError is nonzero.
" P# P; }% W  o# E* \% _& xRasHangUp is called on the connection.
6 w2 W4 h+ A; o3 w, JThe callback notifications are made in the context of a thread captured during the initial call to RasDial. / s; y% w  w: c! r- J$ E
# C0 Q% l' Y9 d6 K- P( l
pRasConn % z7 M9 s5 n& p/ K! H
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.
3 }9 i( ~; {6 \% c/ D6 g( L! uReturn Values! K5 ^7 Y% y. p8 b. J
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.
& g/ \, c# F0 N# |( a. L" ^* Z
! d% H7 J, @4 R- G4 cInclude Raserror.h for definitions of the RAS error codes.& y5 F% i) O2 M0 x7 }  V

% J) E( w1 w' _9 C9 h' pRemarks  ]% m% B' ~" \9 S6 Q
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.& q9 O; g5 u8 }8 x$ D+ ?: _

3 c9 b0 c+ T6 q/ b9 wRasDial 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.
* @1 U7 \5 T; v1 {% `" J# N0 |* t! z0 t5 L( @# I
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.
" b1 d' {! A9 U. |  U
2 [% ?& ^' K% ^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. ! V* |8 v" _1 d0 E6 Y$ J
: E4 e' Q; r$ X# X5 \3 L0 F
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.
5 @. {& ^  E# D, c0 r! F; Z
  G; `, p# G" DThe 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.
! [) _% u% l: g5 ]
! w, @- s. x* z/ X$ L看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号
, M# P1 F8 s6 u, {& ]2 jDWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);
2 k) ?! q: L& ~; `2 w9 l/ \第五个参数是个回调函数,一般都定义如下:$ R- t2 `; K% w* C+ q5 u4 ?
void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)  n" D5 K$ F- J8 E; g
{- F4 e* o7 q7 r$ Q5 r( C
        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;: p; h; V& w5 c1 w9 Q. s0 j
        ; G* A" g; a- L- L; ]
        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
8 x4 E2 q5 i9 D" p' P( c% y$ e}
/ I' w; l# _$ R, i# P这个回调函数将会把拨号的状态POST到各个窗口句柄。  H+ ?% R5 d- f

& a7 g4 H1 Y/ L/ T& m; w4 V8 Q

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃* H. r! ^; B  o
" }1 k- K) y7 l: W; s5 |
/ t8 g, H: J* Y8 o+ r7 p) d
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出
( q1 s' Y# M; w9 A1 P1 U' H( A10:51:59 Message: 正在打开端口,请稍候...% d# E8 i* D. |- I  |4 d1 E7 p! S# I1 m
10:51:59 Message: 端口已经打开' q1 s+ e0 y# U$ T1 \
10:51:59 Message: 正在连接网络设备,请稍候...
* a% L4 W+ V9 P- H# {5 y2 j" n% n' Q10:51:59 Message: 网络设备连接成功+ d4 h! O( V3 C# G9 G( p7 G
10:51:59 Message: 网络设备已经准备就绪# M. l) v: P% s
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
' o3 _1 n" l- L) {, v10:52:00 Message: 正在接收验证/授权过程通知消息
$ a! p0 o+ x" k/ o4 w5 A' h+ z6 l10:52:00 Message: 正在与服务器进行数据交互,请稍候...
9 X! X+ R* Z! t! [10:52:00 Message: 正在接收验证/授权过程通知消息
* Z5 G4 f3 h. L7 t10:52:00 Message: 交互过程结束$ N1 T% g9 m8 @' N/ l2 Y
10:52:00 Message: 正在接收验证/授权过程通知消息
9 T7 J# v9 ?0 k( m* ^. s10:52:00 Message: 用户帐号/口令验证通过,正在建立连接( X. ?3 h) }" y" n" V: ^0 `
10:52:02 Message: PPPoE连接建立成功! s5 e% X/ @) k1 i
10:52:02 Message: IP -> 192.168.0.2
1 X3 e! a% g0 T& i, K. c10:52:02 Message: IP -> 218.109.100.70
5 ^3 A* [3 P! \; S" t7 \10:52:02 Message: IP -> 218.109.98.169
' Y) M6 `% s$ d6 Q7 @- o: D* @
, H' w' k8 ?# ~2 ?

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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