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

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2009-3-13 21:31:26 | 显示全部楼层 |阅读模式
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑 , d: }2 M, i9 K$ }( P( F
& v) @9 m2 _* I
小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:% B0 c8 z5 T7 h: e1 O" a% j: J
; q7 g& j# f& g, W/ X2 ?

) |& W- }. ~. E
  s. ~% H' f5 ^  o, a6 t
) q: f- H2 o8 B7 ]/ T3 h7 X; t4 H$ b8 s4 r; c1 I0 t7 b
该问题让小弟头疼不已... 不得已才发上来求救下:9 l' E, ^+ P# W
我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
/ }9 ^7 [$ h8 x' h) q  而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码, * D3 p$ Z1 @5 v" e
但是 在ping 远程地址(如
www.baidu.com) 就会出现找不到主机问题,
; ]; u, G% m) B2 d' b% A" ^经过我调试发现可能是pstrHost这个变量没转换过来....
  H8 j) a7 W7 U( w: \  不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。
# Z9 v0 {. S# f1 ?$ h+ _: v% T- }) R! v9 G# c* ~& Y
系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。& X. Q* [0 l9 M8 x

/ t0 K6 X% Z, d
// ========以下为相关代码段====================+ S" n- Z9 m7 G
, _; Y6 s9 k# u+ K! a7 s
void CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)! N; x. K0 K8 p' _0 k# V5 a4 o
{
. r* X  o; t7 F. O% k2 o; ]    SOCKET      rawSocket;, f! t2 F& m$ W: Q  A/ J
    LPHOSTENT lpHost;
: ]: r# ?& I/ d2 Y- I$ T, F    UINT      nLoop;/ L5 U6 a  p+ k, |9 _6 K
   
int
       nRet;5 p$ e/ K$ p3 `' t' ~4 i
   
struct
    sockaddr_in saDest;9 q3 R0 _+ e" T
   
struct
    sockaddr_in saSrc;
3 D% l" c2 E( ~6 b& [7 V5 V    DWORD      dwTimeSent;# L& T9 R5 m2 J3 f) x
    DWORD      dwElapsed;% }) @4 X& J8 l- D! u
    u_char    cTTL;2 a/ T$ L+ H6 z6 k5 J
; s8 W$ r& Y/ J. n6 a2 l( {; }

- a' `$ r/ w. B. }3 C1 p    m_hWnd
=
hWnd;
) g+ J0 F7 C  b- n" }, g8 j
' M' C+ Q, X' i7 g    CString str;' o) I' z3 A9 f; t; N

8 u3 [$ X/ h1 e: f& W/ s    ASSERT(IsWindow(hWnd));" Z5 B' j/ S9 T4 C; M  D
. p5 q# b* G; N7 S: E
   
//创建一个Raw套节字
- K3 {  ?0 I" F: w+ I( a# w( _4 P! z
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);2 M9 `! G$ [! S( W; T8 N/ U
   
if (rawSocket ==
SOCKET_ERROR) 4 P1 E& A% b6 k0 d) d8 Q
    {: b: d% N8 e0 j
        WSAError(
"socket()"
);
# h8 K% i" G% K. i( s! `) X5 \        
return
;
* i  X9 k& G7 m* @8 r    }
1 O+ u: a9 Q! j* U' K' ^   
" x; ^" y) Q. o   
//获得主机信息
8 g, Q7 H( C) I2 u; e, L. Z, z
    lpHost = gethostbyname(pstrHost);2 A: j' Q6 R5 \2 ^
+ u, j% s. A0 p# j+ B
   
if (lpHost ==
NULL)! e6 g- Y' I3 f; X5 z6 v
    {
. g+ |3 C# L' @$ @4 x, w        str.Format(_T(
"Host not found: %s"
),w);* Z6 j8 ^# c3 K- I4 z3 M
        :postMessage(m_hWnd,WM_MSG_STATUS,
0
, (LPARAM) AllocBuffer(str));
0 R; T) _5 N5 \+ u1 [4 N        :postMessage(m_hWnd,WM_PING_END,
0, 0
);, i' t. g$ B& C) B8 Y5 U! V& o  E
        
return
;* L; a; ~0 H- O
    }
( S+ Q' }5 f; W: l* R' o" s    7 @5 D. s* f- `  ?3 E" x
   
//构造目标套节字地址信息

0 l) _9 l1 R* A5 B( C1 k    saDest.sin_addr.s_addr =
* y' M* ^) h# [9 [. h! E# j1 i*((u_long FAR *) (lpHost->
h_addr));
5 g) s" Q: M: w# A( F/ G    saDest.sin_family
=
AF_INET;) m8 f+ y6 O+ v
    saDest.sin_port
=
! h: ^- k1 n4 W6 c* [. q0
;
5 Z, _2 z  i4 d" j3 t9 b  J5 r
" d2 @6 @7 I2 g1 m0 L* X# Y   
//告诉用户我们现在的工作
/ u. e) U- `4 Y* Z) ~
    str.Format(_T("Pinging %s [%s] with %d bytes of data:"),6 V" w9 B* f7 X& p9 ^* |/ d
                w,
3 x* K. F% P, y& w- v/ e6 C* L                 CString(inet_ntoa(saDest.sin_addr)),
/ X- m4 b  Y: v% t7 N0 P* ^8 M                REQ_DATASIZE);
% v  B2 a% ^9 \- q    :postMessage(m_hWnd,WM_MSG_STATUS,
1
, (LPARAM) AllocBuffer(str));
  |  |$ ?- |9 R/ y- \1 d# ], M/ L0 \3 h6 n
   
//多次ping

: b! O- q7 c4 U+ g3 ^/ b
. h" T9 e+ z8 H$ l- y* v. lfor (nLoop =
9 }5 h, \' k! R0; nLoop < nRetries; nLoop++
)
' N$ X0 e, t/ k( A! }% H    {
6 x) v1 Q, w5 f" P& Z$ w        
//发送ICMP回应请求

, @# w1 h  Q. @8 m9 m        SendEchoRequest(rawSocket, &saDest);: K; B: y3 m; f& u3 H0 p
7 z" B  G& {; ^" x) o
        nRet
=
WaitForEchoReply(rawSocket);
/ i: D  O6 t. c        
if (nRet ==
SOCKET_ERROR)
( A9 A+ `( c1 k& r        {' W7 y" l8 X3 _& C- |5 E5 Q
            WSAError(
"select()"
);4 b1 K4 W5 m- ^
            
break
;
, i. N6 [& j  L7 t0 C        }8 w/ E2 ^) n/ T4 z
        
if (!
nRet)
/ r% L. o& l; l7 F1 ^7 {        {1 N8 X' j: _) z0 z! z% y
            str.Format(_T(
"Request Timed Out"
));
0 x& d: {5 z. |. ?6 w- `            :postMessage(m_hWnd,WM_MSG_STATUS,
3
, (LPARAM) AllocBuffer(str));
5 Q" J  P: k- X. S' u) i. J, \; Y        }
! |- g+ D, X/ q$ L        
else

3 O3 w. S. c" @# H- O( r, q& y; C0 A* g5 |! Z
        {
8 ^9 w/ H- b; L) Q4 k            
//获得回应
( ?, d$ L0 W* q( c9 t& ]- C            dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);
2 f* A  e/ y( h9 Z  e, Y% H) B5 V, U$ o6 r0 t
            
//计算时间

5 e& }; {% j* F/ k            dwElapsed = GetTickCount() - dwTimeSent;
4 P4 M5 Q" T8 o6 }            str.Format(_T(
"Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"
),
$ P, M7 Y; o* v* v* P- J( r& k: e                nLoop
+1
,
* q6 t/ y( l3 R: G* J                   CString(inet_ntoa(saSrc.sin_addr)), ' ?* Q* f" L- E) d
                   REQ_DATASIZE,$ w; n: j: K$ i3 e5 B3 D3 k" ^
                   dwElapsed,
6 i% }. K6 K4 m, T                   cTTL);
6 m6 W( r% o) s, P: |" e
0 {1 v6 [% D, D- ?$ Q            :postMessage(m_hWnd,WM_MSG_STATUS,
2
, (LPARAM) AllocBuffer(str));7 {( a- |% ]0 ^: a& p1 {4 }

& I1 d" b. [5 p' d8 w& c8 F            Sleep(
1000
);
5 ~  p# Y: ?( k( K' i  |        }
& H3 u6 j  [) {! c    }# y, R, [6 _3 [& x+ ~2 V% g
    " U6 u' O+ G( K. j3 Q! e5 B3 w
    :postMessage(m_hWnd,WM_PING_END,
0, 1
);
# n! G  M4 u* n" `) z4 g0 Q3 C* p2 @8 e$ V: c
    nRet
=
closesocket(rawSocket);
! r  k5 e2 `0 t4 K4 \# i" I   
if (nRet ==
SOCKET_ERROR); D/ {, d. y# _2 B$ w- t
        WSAError(
"closesocket()"
);
; q; `& w9 S, M7 i
2 m, t( J0 ^2 A6 B}
& d' L" C  p6 G  Z
发表于 2009-3-13 21:41:27 | 显示全部楼层
:confused我很想尽全力帮助你,但是我什么都不会( Z% q( g+ I8 M
纯粹帮顶,顶LX个肺。
发表于 2009-3-13 23:00:12 | 显示全部楼层
WSAGetLastError()
 楼主| 发表于 2009-3-16 10:40:20 | 显示全部楼层
:(问题仍挂着 没得到任何解决  2 K' q9 @, z0 V# n6 N. A- a  M# u' H
  这几天为它快同疼死了
发表于 2009-3-16 12:25:21 | 显示全部楼层
代码的东西我也爱莫能助。。顶下。。
发表于 2009-3-16 13:18:32 | 显示全部楼层
。。。VC没搞过。。1 K0 e4 Q: s7 d3 Z( s' _& p
有没有试试直接输入本机127.0.0.1是否可以正常呢?
发表于 2009-3-16 13:43:27 | 显示全部楼层
代码方面我是什么都不懂
发表于 2009-3-16 18:22:55 | 显示全部楼层
你要学会调试错误啊~# r9 K  k0 S' p
核心编程第一章不是在说GetLastError函数了嘛难道我还要很明白的跟你说WSAGetLastError是WinSocket下的GetLastError版本?
$ n' m1 P0 K$ r/ F, v" g& k至于那时候我为什么叫你看核心编程P6是想让你知道获得的ErrorCode可以用Error Lookup工具来查看信息的吗9 u4 H5 I) E/ r  p6 Y9 t
要知道这工具是只有VC++下才有的工具- -那那些VB啊 delphi为什么没有呢 好吧 不解释" r3 R/ f" J5 f8 m6 _
如果一个程序员连自己解决问题的能力都没有,在谈何XX呢" {/ M2 u" C- _' a2 o/ p# q
何况我已经跟你说用WSAGetLastError,谷歌一搜一大把啊
% w; x8 d% K7 \8 ^$ A7 Khttp://www.google.cn/search?client=aff-cs-worldbrowser&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=WSAGetLastError7 }3 s. F% E* ^  G; H
) a' F$ b5 ]. Z3 g5 s3 W, @
我建议你好好把核心编程第一章好好看下吧....(虽然你说你看过- -)
 楼主| 发表于 2009-3-25 18:34:32 | 显示全部楼层
这个程序的问题已经解决" S+ [1 o0 d6 g4 w& P% Q( l
目前遇到另外一个路由程序问题~·
4 B4 y& n. {2 x0 T) {" w/ H  我把 WSAGetLastError(); 函数放在疑似有问题函数后面~· 设置断点) Q7 F6 o7 P3 m  Z0 }( r/ `
查看了下.. 吼 还真有所收获
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-27 18:51 , Processed in 0.054752 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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