下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2003-9-21 10:56:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调用一般的微软公布的API只能执行一般的连接到网络之类的功能,无法实时获得网络设备以及数据传输之类的信息。/ B* [% l0 h( |- z* }
想编一个程序,实现类似于网通拨号器的功能. O7 R, P0 O: @+ y

! [( e" h: D) Y8 S10:51:59 Message: 正在打开端口,请稍候...; s! X9 `. o* @! r, w8 n
10:51:59 Message: 端口已经打开* b( ]" {" v2 c  J! s4 O" G: V
10:51:59 Message: 正在连接网络设备,请稍候...
& ]* p! G5 D" n. |1 m10:51:59 Message: 网络设备连接成功
1 T. }* Q6 k, E6 q6 h10:51:59 Message: 网络设备已经准备就绪" u, p. p. v8 R7 r( p, n4 J
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
+ Q8 x: ^6 a6 s- L* t, i- v10:52:00 Message: 正在接收验证/授权过程通知消息
. C) ?% u6 N" L$ |% G- {3 j10:52:00 Message: 正在与服务器进行数据交互,请稍候...
  {. r3 k: f& Q/ t10:52:00 Message: 正在接收验证/授权过程通知消息! g6 {$ \* j* J; j! ~7 x" |- |: J
10:52:00 Message: 交互过程结束* a, ]' \, s0 t0 j- r" b* u
10:52:00 Message: 正在接收验证/授权过程通知消息" O3 F, o4 _1 r: X6 H% H& N
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
- I8 E  y! I, C: K  z- J- i10:52:02 Message: PPPoE连接建立成功5 a8 m& V% M2 M. {- l. G* h
10:52:02 Message: IP -> 192.168.0.2- G# Y7 u; b$ ?& Z% d* Z" ]4 P6 M% @
10:52:02 Message: IP -> 218.109.100.70
6 i+ d+ s# t+ n! N! w) Y10:52:02 Message: IP -> 218.109.98.169& w5 H6 I5 I5 n* Y2 V( M
# C2 J& V/ q9 L' M% O) b2 h/ O
给一个实例的代码好吗?7 Y7 A5 `  w4 c; C
我的邮箱是:eagle_twenty@163.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2003-9-21 21:00:00 | 只看该作者
网通的拨号器实际上是一个PPPOE的拨号软件,因此你的要求是要自己编写一个PPPOE的拨号程序,这样就能够显示出所有的信息来,前提是你必须熟悉pppoe的编程。. S. W3 C- J5 e# a* W
我没有编写过ppp之类的软件,没法给你一个实例。
7 @: X0 ^! @) l  V% D4 b我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。3 b/ i7 M; m; l; D9 m8 c' D9 p
标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API, a9 o# Z3 X8 C$ b! ~+ f$ s3 V

该用户从未签到

3
 楼主| 发表于 2003-9-21 21:45:00 | 只看该作者
以下是引用hzzh在2003-9-21 21:00:00的发言:; g& Q) U. l+ J
我没有编写过ppp之类的软件,没法给你一个实例。
! [( P- v# r9 p6 y 我想,偷懒的话,可以安装一个RASPPPOE软件。RASPPPOE只是提供了一个pppoe的协议,拨号直接利用了微软的拨号器,因此只要按标准的拨号软件编程方法就可以编写出一个拨号软件来,可能得到的信息稍微少了一点。
  f9 O$ _9 }9 i 标准的拨号软件编程方法可以参考MSDN的Establishing a Dial-Up Connection to the Internet 中的API
' s: I( {, y0 h( E' T
% |  K& e) i- v( h1 G
# }6 Q2 |; W: b  f
很可惜,真的太可惜了。; d1 p8 P2 B$ Y' n; 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) connections% Q. Z0 a$ z. ?# y

) H! u) Q7 K5 H是一个监控拨号网络连接的MFC类,或许能够得到一些拨号过程消息' G' ]# f8 S4 K
4 C" `$ h  }0 I8 Y/ ]) X. w3 H7 f9 j; \$ }
http://chulsoft.xiloo.com/code/ras.zip

该用户从未签到

6
 楼主| 发表于 2003-10-25 00:48:00 | 只看该作者
谢谢周老师,不过这个问题我自己查了将近一个月的MSDN,终于搞定了。  C3 b, f3 f& k3 ?! r2 v
有一个RasDial拨号函数的定义如下:
+ |2 E4 R8 R" B1 G1 h$ F' ]DWORD RasDial(: Z5 B* L9 @: ]0 ^
LPRASDIALEXTENSIONS dialExtensions,
- v$ s' m$ d0 ]4 m# x9 n7 c. ?LPTSTR phoneBookPath ,
1 m  `) u0 c* I( v, P, dLPRASDIALPARAMS rasDialParam ,
& T6 U. d8 ]$ z  I* Y9 q/ nDWORD NotifierType,
$ l8 r8 v1 t! q# K, Q/ zLPVOID notifier,
) f% j/ B5 F1 U* t  nLPHRASCONN pRasConn );
  K' y0 D; y; O2 U* F6 T) u& E* y! j1 z$ a7 O; Y7 H4 {/ S
我的MSDN的解说如下:( Y* s+ {; f% e! D/ t
Parameters
' m. O: l+ J  M% `dialExtensions
. e3 [! ?% [/ G1 c; r9 e5 TThis parameter is ignored and should be set to NULL. On Windows CE, RasDial always uses the default behaviors for the RASDIALEXTENSIONS options.
: t, L/ X$ h  o  J1 h% WphoneBookPath $ ^/ u* z* y: s: {7 P* 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.
& _$ Q6 @5 p3 }# crasDialParam
0 H) H8 B& w% O$ bPointer to a RASDIALPARAMS structure that specifies calling parameters for the RAS connection.
: d* J: N7 S/ c. S" xThe caller must set the RASDIALPARAMS structure’s dwSize member to the sizeof(RASDIALPARAMS) to identify the version of the structure being passed. * L% S* d+ q# ], D3 t1 F/ h
0 c$ \- H2 \, c6 T) }. W
NotifierType
! p9 a8 X: V6 S4 z5 j! uSpecifies the nature of the notifier parameter. If notifier is NULL, NotifierType is ignored. If notifier is not NULL, set NotifierType to the following value:
4 [2 d8 c5 K. k$ c+ U' r6 t6 @- fValue Description . g% V( [! R# b
0xFFFFFFFF! T2 V4 u9 E6 j4 u1 H
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.  
  B% o; n+ z. Q$ U( d The progress notification message uses the WM_RASDIALEVENT message code. 6 a* a' P& F9 M

* `5 @( B" A5 [/ g! V' [( M
8 Q! ?4 b/ w* B/ T0 P# a
1 i, ]6 q* J0 [) T2 f
8 s" c) O, f) ^+ Inotifier
* g2 M8 h- J# R; Q$ H" XPointer 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. 3 y, r" |3 q% @2 k8 }; m, k
If notifier is NULL, the RasDial call operates synchronously: RasDial does not return until the connection attempt has completed successfully or failed. 3 E- X  a! `6 e3 b- T

- q' s# I, J' M2 B$ NIf 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:
8 i% `# I# s! Q; I# f* [6 \  ~" R+ g) S/ u* }2 k, [" {
The connection is established. In other words, the RAS connection state is RASCS_Connected.
+ K! {9 V9 W  TThe connection fails. In other words, dwError is nonzero.
! @# {! C% I/ n4 DRasHangUp is called on the connection.
4 R. X  q& J4 o# eThe callback notifications are made in the context of a thread captured during the initial call to RasDial. 7 _& I5 O' d- w$ @
& z7 j0 s) h& a. l+ J
pRasConn
( x. c6 U: z& E8 A. RPointer 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. # u* _$ \. M. U. J$ S
Return Values
8 P) t% O3 G  IZero 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.
; H% ~$ l9 p( p, ?. r. U: [/ l  f
Include Raserror.h for definitions of the RAS error codes.& x, M" e" [) ~0 |

5 W$ L# a- V- |  j, J% q) {8 uRemarks" @( W( q+ D) h+ x- E4 `6 `; o
The szCallBackNumber and szPhoneNumber members of the structure pointed to by rasDialParam are not used and should be set to NULL.& ~9 N+ V# d/ f& u2 F5 I& X' d
' ^! l, Z2 b+ J% d5 i: W2 A# o+ K: Y
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.
8 a4 O* E7 e3 V9 W+ N6 _$ [, g+ U+ X
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. ) C1 _# A$ I7 [+ z
! L8 N) F) O# V2 `# J+ T) X6 X1 w
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/ }3 }# N! i# s$ ?! s+ z9 |9 n
) l# _4 Z" {' H! |4 d$ x+ ^" W4 AAn 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 V6 ?9 [% b" o2 l, V3 F6 ^
7 ]9 L9 d8 z) @
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. ! c  d2 l" S9 I$ D) k( S8 a, \& e

! |" u. I) a8 m& n% w! Q7 O看了好久才算是略略通了一点,要实现我原先预期的效果,首先要用RasDial函数进行拨号" u/ a  M& x8 N2 Q$ X* p* `  w; R
DWORD dwRet = RasDial(NULL, NULL, &RasDialParams, 0L, (RASDIALFUNC)RasDialFunc, &hRasConn);
; A9 k" I: P. _* o- W9 m第五个参数是个回调函数,一般都定义如下:
, h$ R3 p; B' N" i+ X( k8 ~7 `9 v( Hvoid WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
; X" t* d& B1 y+ u: N: Y{
1 i3 F4 Z6 L) ^, U        CDialerDlg * RasDlg = (CDialerDlg*)AfxGetApp()->m_pMainWnd;
$ D9 M7 l) S4 l/ E8 r7 H       
% \; X0 j2 A3 I0 V1 I, C        RasDlg->ostMessage(WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);* y/ g# b( n+ P2 q
}; a+ d- X# p" H' s3 Q
这个回调函数将会把拨号的状态POST到各个窗口句柄。  |9 V- a+ j; R9 A4 s

  X" N' U. O6 j8 c* X- t% L

该用户从未签到

7
发表于 2003-10-28 12:53:00 | 只看该作者
呵呵,自己把MSDN给啃出来了,这是最高的境界了,可喜可贺。确实MSDN中什么都有,只要肯啃
8 \: V5 _. G7 I, ~- _  g
: a0 T" L5 [( P. @, V, ~+ d) F8 D: J3 j- q3 f+ z9 t- b
在回调函数void WINAPI CDialerDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)中,不需要再用PostMessage把消息发到主窗口了,只要直接用switch(rasconnstate)就可以输出  R5 x8 @* u3 |3 O5 T; b, m, v1 s
10:51:59 Message: 正在打开端口,请稍候...% l; S4 ]: @, A4 b5 h3 V% |
10:51:59 Message: 端口已经打开
0 T+ i* D$ T) f4 Q. w( A10:51:59 Message: 正在连接网络设备,请稍候...
* u/ e4 y: u) r% w: l4 X) n" Q( |6 ^10:51:59 Message: 网络设备连接成功
% ]* E# l8 U! |10:51:59 Message: 网络设备已经准备就绪) c4 v) S$ }% ^' K/ c
10:51:59 Message: 正在验证用户帐号和口令,请稍候...
% Z( o. o2 q2 O; x10:52:00 Message: 正在接收验证/授权过程通知消息
3 |& k' u1 N0 p( P) t- ~10:52:00 Message: 正在与服务器进行数据交互,请稍候...
6 f; t7 T, N& m# c1 \10:52:00 Message: 正在接收验证/授权过程通知消息
( v) A% A& a. ~8 v3 n. P, v10:52:00 Message: 交互过程结束5 |$ j) B" Y- I
10:52:00 Message: 正在接收验证/授权过程通知消息9 [2 U' s. y2 E: e. I7 D/ @
10:52:00 Message: 用户帐号/口令验证通过,正在建立连接
* f* j0 @5 e( D10:52:02 Message: PPPoE连接建立成功5 s8 \8 K2 M' s& s2 D1 h
10:52:02 Message: IP -> 192.168.0.2" M" ]: G& m8 Q  M5 [
10:52:02 Message: IP -> 218.109.100.70
9 {/ w( \& m, a& c% D10:52:02 Message: IP -> 218.109.98.169' B) J, b6 g/ c- G7 y

% ^! T+ m* N  `6 f/ O

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

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