诚毅小家|集美大学生活【集美大学,诚毅学院,水产学院,师范学院,美术学院,财经学院,体育学院,航海学院,集美学村,石鼓路,龙舟池】

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1430|回复: 8

VC的ping程序编写问题..紧急求救

[复制链接]
发表于 2009-3-13 21:31:26 | 显示全部楼层 |阅读模式
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑 + ?- D' |2 l/ P/ k: K8 g

  s2 a# P6 a! n小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:
5 j. W% a$ Z: f) n
; k. X( L6 d& |7 `
2 X2 _& L3 H' N8 G2 Y; Q6 v: i; C+ v. s7 G- s$ \3 @
9 P: `( _. |( R' `

$ z; ^3 n! O& }5 l* ~- M. `5 ?" N! ~该问题让小弟头疼不已... 不得已才发上来求救下:
& N/ f6 V7 l) p  u我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
2 {; G8 W4 u/ }( g3 L. u  而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码,
" g  `& Z  o/ W9 J4 r但是 在ping 远程地址(如
www.baidu.com) 就会出现找不到主机问题,
+ G5 x- s5 H4 ?  x经过我调试发现可能是pstrHost这个变量没转换过来.... / v3 ~8 ~. J2 V. L: C! K" i# R
  不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。
$ V; }: [1 n' F  `* }4 N5 Z& X2 a# a+ H: p* g2 E4 _2 {( z
系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。) L' B2 Q0 i( n; }" `& a7 o2 |
* H5 h6 u3 X6 w; {
// ========以下为相关代码段====================9 ?' Z7 t0 p" p
! P9 n$ q6 K  A0 V! D
void CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)7 x9 ^( H3 f  v3 U! e
{$ ^2 F' f% x0 A2 ?2 B) W' w
    SOCKET      rawSocket;
* T! ^% z; a. ?+ C    LPHOSTENT lpHost;( F* S& q( o, s, Z" d* \) I* a) }
    UINT      nLoop;
; ]5 U* a+ @+ S- R8 U$ S, g   
int
       nRet;
; Q; D/ p2 ~$ @; e   
struct
    sockaddr_in saDest;
* S. |( Z/ L9 W. q   
struct
    sockaddr_in saSrc;
, J* A0 S& P0 y9 ]: W9 e2 D    DWORD      dwTimeSent;5 X# I9 ~6 @8 [" t% Z& G  ?
    DWORD      dwElapsed;/ b( K" j+ t% _6 e! m! a9 \
    u_char    cTTL;5 P" D" N1 U" Q3 f% ?8 h5 m

4 [- t* o' M: V, l$ V2 c- O& Y! d. k% m2 u
    m_hWnd
=
hWnd;2 @& ~7 O4 {, N% L4 D& E1 X/ r) J: \4 K

0 |: j* _# Y- E- ~( c- a4 Z    CString str;
/ D1 G; s+ S& t* g
3 ]6 i( C8 h: V6 ^3 X* I- Q    ASSERT(IsWindow(hWnd));
* r0 N2 M' j" v7 `
; x) E- ~" y5 }) \   
//创建一个Raw套节字
6 g% ?0 g; G* a( t/ i
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);% O% h& h0 k. T" ?7 r8 y
   
if (rawSocket ==
SOCKET_ERROR)
6 e6 o4 O0 r7 f6 {; I) N    {6 ~& E1 ]* c6 ~5 c0 o1 y
        WSAError(
"socket()"
);
. ]3 D# K4 F# U% ^# h, @( K- [        
return
;5 A6 T# n5 E. ]' P5 m1 k* _
    }
8 X$ K, {# {$ _' Z, v* W    + h" H) B3 `+ X8 I! g8 K; O; |
   
//获得主机信息
: Q8 e0 f1 U9 o5 \: G/ Q
    lpHost = gethostbyname(pstrHost);! T3 K+ o+ P: w1 A/ n4 E; d

- g/ n1 e- S# s2 E7 f2 a   
if (lpHost ==
NULL)- ~, t, l  P# ]8 ]& G' x
    {
- X: s  I2 {1 Q        str.Format(_T(
"Host not found: %s"
),w);
) D  h) [( c! t  |2 {& n/ k        :postMessage(m_hWnd,WM_MSG_STATUS,
0
, (LPARAM) AllocBuffer(str));
& E/ f+ N& ~+ O4 z        :postMessage(m_hWnd,WM_PING_END,
0, 0
);: p: I5 |/ B& n5 e
        
return
;
) l0 i; r1 T2 d% u9 h- h    }
+ z! d- H2 X& F6 Y( Q0 D" E8 X4 k   
* K5 p2 d/ q9 i' Y   
//构造目标套节字地址信息

0 ]8 p, m0 A8 B4 r: R    saDest.sin_addr.s_addr =
% D" ~' \5 N* b) u*((u_long FAR *) (lpHost->
h_addr));
9 m4 P; `4 b0 A6 n: `6 ~% G    saDest.sin_family
=
AF_INET;9 c& F# f1 ~6 t  m  ~7 P
    saDest.sin_port
=
. Z4 F9 h. I8 _0
;+ P+ s, y: p6 q/ i9 d& Q
# ]9 i3 A  T4 j1 F5 Q- g
   
//告诉用户我们现在的工作
$ s# V2 b1 S. X4 L6 p# Y4 o# O
    str.Format(_T("Pinging %s [%s] with %d bytes of data:"),
# M% E, x9 m' Z. i5 v! \                w,
8 j3 s9 |$ h: f9 ?, Y                 CString(inet_ntoa(saDest.sin_addr)),
3 q" F) m- Y4 l7 C# h* Z                REQ_DATASIZE);0 D) m" B: O$ u
    :postMessage(m_hWnd,WM_MSG_STATUS,
1
, (LPARAM) AllocBuffer(str));
' m4 ]/ S% B- z; h/ F1 ]" F! X+ x1 @) U0 R; e
   
//多次ping
$ q' {3 L' B7 F% y% B) m  m4 U
& F9 }# _9 c5 F& w) I
for (nLoop =) R1 i' k' R0 C( K: Q2 m
0; nLoop < nRetries; nLoop++
)
1 }) X- t7 [; q( N: i    {
4 U, d3 T& }5 |; Y% _% J7 t; {        
//发送ICMP回应请求
) L3 h4 t+ ~$ J
        SendEchoRequest(rawSocket, &saDest);
" U+ u4 G9 |; e& h8 W: A; G8 q! ]$ ], r, g( _2 ^
        nRet
=
WaitForEchoReply(rawSocket);
' I7 G  x0 X: o; y. E        
if (nRet ==
SOCKET_ERROR)+ {0 i; O' \4 X0 M8 f/ r# @
        {
, T$ K7 K0 g$ X& C9 i8 i% G5 o            WSAError(
"select()"
);1 G* U4 E' i* f" v
            
break
;
$ L& y- h+ V# H5 H- Y! @! Q        }9 e7 G- l+ k5 q3 r, a& B
        
if (!
nRet)$ s) l$ Y+ M* [- a4 v: I
        {; H$ O  k5 _% H
            str.Format(_T(
"Request Timed Out"
));0 f7 r9 Z: q/ P$ |0 w& Y* |" c
            :postMessage(m_hWnd,WM_MSG_STATUS,
3
, (LPARAM) AllocBuffer(str));
7 n( c5 o7 m2 R0 S8 u2 _! m& P        }5 a4 ^: w8 W6 f7 ^& h5 Q
        
else

) q9 E1 U6 p9 S+ \6 @
9 ]$ t0 P! P9 M* K, \% S5 k8 m5 c        {
$ t7 J2 K- m) P: @2 p) @/ o            
//获得回应
5 Q! R" ~1 M6 x+ I5 `            dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);8 n  i1 @# i8 S% Y
8 e- Y( K% X7 B8 Y% `' E6 |, l+ k7 I0 y+ A
            
//计算时间
+ \* L% S+ m7 ^$ G+ C- x
            dwElapsed = GetTickCount() - dwTimeSent;+ _4 r% P/ Y4 w) s6 v: ?
            str.Format(_T(
"Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"
), # U5 b/ |; Y  l9 ~
                nLoop
+1
,
8 T5 \( o: K. w0 @, |                   CString(inet_ntoa(saSrc.sin_addr)),
' j) V9 B1 Z! y6 L7 z2 P                   REQ_DATASIZE,3 K7 p  {8 G6 V: }/ D
                   dwElapsed,/ X, b$ Q/ ~3 S+ ~. ]. |& h' V0 `- ?
                   cTTL);, l# s$ y& R4 A+ \

- i) m+ L* ^  Q% |( l+ Z3 I            :postMessage(m_hWnd,WM_MSG_STATUS,
2
, (LPARAM) AllocBuffer(str));
- f1 _3 @$ b* Y& Q3 x; ?
! @2 A- k8 b- ], _' N6 F4 P! M            Sleep(
1000
);  M) m1 Q' M- J1 T7 [* u
        }
; Q& B& f6 k% z) |# _    }
' }  p+ J0 s4 n( o   
4 D# z8 Q( @( ]3 [' A    :postMessage(m_hWnd,WM_PING_END,
0, 1
);
" f! }8 E+ E% u; P% U( w- r! o) p9 x
% Q. g3 n, C1 g    nRet
=
closesocket(rawSocket);/ |9 Z" s/ a$ y' F- M
   
if (nRet ==
SOCKET_ERROR)
' ~7 Z& C7 F7 r- f. t( N        WSAError(
"closesocket()"
);
7 H3 _7 |, T0 H9 j3 `# |4 V! s' L! C# Y0 F% Y. ]4 M+ R
}

; `/ C) V4 `  o1 V- i
发表于 2009-3-13 21:41:27 | 显示全部楼层
:confused我很想尽全力帮助你,但是我什么都不会8 A) F: t' @# T$ m6 P) X& ]  E( m
纯粹帮顶,顶LX个肺。
发表于 2009-3-13 23:00:12 | 显示全部楼层
WSAGetLastError()
 楼主| 发表于 2009-3-16 10:40:20 | 显示全部楼层
:(问题仍挂着 没得到任何解决  
/ q# z6 r3 }; m% ~8 U7 g  这几天为它快同疼死了
发表于 2009-3-16 12:25:21 | 显示全部楼层
代码的东西我也爱莫能助。。顶下。。
发表于 2009-3-16 13:18:32 | 显示全部楼层
。。。VC没搞过。。/ J0 _$ W2 W8 W$ L
有没有试试直接输入本机127.0.0.1是否可以正常呢?
发表于 2009-3-16 13:43:27 | 显示全部楼层
代码方面我是什么都不懂
发表于 2009-3-16 18:22:55 | 显示全部楼层
你要学会调试错误啊~7 z+ ^, y. Y2 g: E+ x
核心编程第一章不是在说GetLastError函数了嘛难道我还要很明白的跟你说WSAGetLastError是WinSocket下的GetLastError版本?. ^  i: A$ `7 F" c+ S1 U
至于那时候我为什么叫你看核心编程P6是想让你知道获得的ErrorCode可以用Error Lookup工具来查看信息的吗
; K( o+ X  l2 s4 ~+ j要知道这工具是只有VC++下才有的工具- -那那些VB啊 delphi为什么没有呢 好吧 不解释
; f5 S) y0 o5 u0 @) y$ y* N0 b- l& q如果一个程序员连自己解决问题的能力都没有,在谈何XX呢
) o$ m7 }% f$ f( D5 V0 N7 Y何况我已经跟你说用WSAGetLastError,谷歌一搜一大把啊8 a2 a' I  c: f" t7 w
http://www.google.cn/search?client=aff-cs-worldbrowser&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=WSAGetLastError3 ~6 W1 P6 h6 A% O# }" [! |- {

. W% ]+ A6 J) u3 F我建议你好好把核心编程第一章好好看下吧....(虽然你说你看过- -)
 楼主| 发表于 2009-3-25 18:34:32 | 显示全部楼层
这个程序的问题已经解决
. z7 ?; Z6 K6 [5 b3 O 目前遇到另外一个路由程序问题~·
8 m  }" G: R- p2 A( M& O) r  我把 WSAGetLastError(); 函数放在疑似有问题函数后面~· 设置断点) m7 G" d0 R8 Q- j" z/ n$ J" c
查看了下.. 吼 还真有所收获
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|诚毅小家 ( 小家社区工作室 闽ICP备05007965号 )

GMT+8, 2025-4-1 16:19 , Processed in 0.083978 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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