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

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2009-3-13 21:31:26 | 显示全部楼层 |阅读模式
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑 ! X3 _* u0 ]1 m3 \- O

6 B( [/ b4 b/ d8 }小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:, K; _0 a8 N2 G/ w& f
4 A/ m6 C' ~- L  C7 q4 q: |) l* N
; g" Y/ ~: t9 J9 _* b
  ^: S, u8 Z# v
( R/ \1 y7 J- _1 D. Q

- N) T6 k9 y' S. }3 B. m该问题让小弟头疼不已... 不得已才发上来求救下:
2 R$ Y) ^9 t: g8 S" ~; \2 W* k我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
! O: h) R, j% P3 Z! H$ T2 T. l. W  而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码,   H( U2 l& z9 P) |# U
但是 在ping 远程地址(如
www.baidu.com) 就会出现找不到主机问题, " J) z1 ^! k* Q3 ~$ h$ w" Z. _
经过我调试发现可能是pstrHost这个变量没转换过来.... # n7 E$ D, `" \& ~, U5 T; _' E
  不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。+ k( }4 g3 b' M, O

- g% `& x- {" m/ T& k系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。
5 |0 x( y- |1 ]0 O! v; L7 }# ~
0 C8 g; w. n7 l, M
// ========以下为相关代码段====================
) s/ w6 d! o* c% l2 c
; s' A1 M# I$ a3 I) {
void CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)- u% ]5 p: A- H! e0 `; K) o# K
{
" {; a( H8 B" O    SOCKET      rawSocket;
! g' Z5 q+ f" X- X! V    LPHOSTENT lpHost;: v+ V; |6 D& k3 Y4 e
    UINT      nLoop;
1 w1 ^3 L& {0 c. Q   
int
       nRet;4 x1 B0 _* ~& g! N/ p6 F
   
struct
    sockaddr_in saDest;4 u) ?  G3 \% v4 x" `% x
   
struct
    sockaddr_in saSrc;. c$ p9 I: U( ^* o5 A6 [  ]. [; T% v2 w, R
    DWORD      dwTimeSent;; k& @. f% I7 Q2 z: q1 J& ~+ R) G
    DWORD      dwElapsed;2 R$ Q$ j. Y  E: \
    u_char    cTTL;" w1 I0 Y7 `3 b3 [! F  |

' G( a, y! l$ R4 x! w' s0 R. m% W: |+ ^  k3 {& b2 M8 ^+ z$ t
    m_hWnd
=
hWnd;! `0 o; h* g4 N$ D  j" F

4 G$ w9 g+ b2 g4 Z& ^$ R    CString str;+ ], Q4 u$ E% W. Z! w
/ U- o# I( H% O8 m' w0 y4 I
    ASSERT(IsWindow(hWnd));
  R- R: Q' J% l, `# A* v$ J6 Q$ O4 G6 @
   
//创建一个Raw套节字
3 ~5 f: a- j, {2 X0 m9 }1 r' z
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);) Z3 E7 |! f( x' X7 V0 N+ J7 w
   
if (rawSocket ==
SOCKET_ERROR)
" o3 a" G; T4 `2 \    {
! O! L0 T! j. H: i  H        WSAError(
"socket()"
);5 @9 v- K# P( o1 b* e
        
return
;
3 d7 G; a0 s+ h' o: a    }
3 V. H8 Z, A# ~   
0 S( N: S' d: i6 S+ o: d, @' |" ]   
//获得主机信息

+ @# M1 `1 W9 Y' t' T9 ?    lpHost = gethostbyname(pstrHost);  R/ C0 f0 Z3 w- W
# C) i9 e( ]+ }/ S
   
if (lpHost ==
NULL)9 l9 {3 b# b+ @0 s
    {
, h/ i. i2 I5 G        str.Format(_T(
"Host not found: %s"
),w);  t& {6 I7 ?" A, D: J1 m* d
        :postMessage(m_hWnd,WM_MSG_STATUS,
0
, (LPARAM) AllocBuffer(str));
( _" [# u. n3 u4 E. E2 q        :postMessage(m_hWnd,WM_PING_END,
0, 0
);
/ N% n! v- L( j: D8 z8 J3 F5 X        
return
;
. k/ D* _% W7 E. ]    }
7 t( X+ r( ]( h. p5 U' [# `   
! z6 Q* g4 q0 Y6 t  [" Z   
//构造目标套节字地址信息

4 I$ L* g5 k. Q$ {$ z    saDest.sin_addr.s_addr =) L3 ?7 d; O# N) e( C; M
*((u_long FAR *) (lpHost->
h_addr));* C* z2 i4 b9 r0 ?$ q
    saDest.sin_family
=
AF_INET;
  V1 V/ K! w' A0 q9 U    saDest.sin_port
=) W/ V9 H+ {0 i% Y# z" S9 l
0
;. G4 W. P$ c; p% @- X' }  Y& B" z. Z
1 ~! |6 D/ l! t0 }4 A; s
   
//告诉用户我们现在的工作

5 Z  I( J3 s$ \+ c    str.Format(_T("Pinging %s [%s] with %d bytes of data:"),- X8 W% M, [) p$ T. K% u
                w,
5 J  u' A6 `, P  d4 k: N                 CString(inet_ntoa(saDest.sin_addr)),, Z( I" k* ]7 p5 M! Y! Q
                REQ_DATASIZE);3 ?* C5 W9 o3 M7 T4 \5 i4 g1 B
    :postMessage(m_hWnd,WM_MSG_STATUS,
1
, (LPARAM) AllocBuffer(str));
- _7 F# X0 ^9 q" Q) L( |1 |
' N9 X2 P) K$ {; Q   
//多次ping

% T9 g  v, |; u5 c) y' t
* D; D9 [- D! e! O; r! B4 Rfor (nLoop =7 h8 a: o/ P/ P1 A
0; nLoop < nRetries; nLoop++
)! g- m5 ^: E* K- `3 i
    {
$ a3 z8 O  I4 O& ~        
//发送ICMP回应请求

0 F# f2 |$ F. K$ G& s        SendEchoRequest(rawSocket, &saDest);9 d2 R6 r" [# L" E7 Y
+ t/ u% ~1 m5 l4 {) e
        nRet
=
WaitForEchoReply(rawSocket);
4 c& p* J9 x/ I. w2 u% A0 [, H        
if (nRet ==
SOCKET_ERROR)
1 W. u$ Y% {5 h9 |% o$ y        {- {7 |5 t% D/ \
            WSAError(
"select()"
);
* ?5 O7 |( ~* S& r            
break
;
: l) u. `: T# c- R: S        }2 W- O2 D* b6 H. z3 a6 W9 J
        
if (!
nRet)
1 j: ]+ {. f  p& E2 w) g4 H2 e2 ]        {
5 m# ~" w) g/ R" k. {1 Y- B! C            str.Format(_T(
"Request Timed Out"
));
' F' _( D5 q6 Z* k6 k  t5 X2 ?            :postMessage(m_hWnd,WM_MSG_STATUS,
3
, (LPARAM) AllocBuffer(str));
, m  @7 j0 Q- }% C' v2 m+ E0 ^1 T# Y        }. M( U. n: I- _2 X
        
else

3 |8 w( H  V* b  C& l3 \& [
/ u" v4 c- b& {, C) s! R        {& m8 v& F7 D# w0 G  g7 o1 v
            
//获得回应
: @5 b! k- ^2 p: {            dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);$ w5 q8 U8 ], }2 b3 |

* U. w/ }) U; J) q6 R/ ~            
//计算时间

5 }: _) F) F+ S" C* [$ E7 P            dwElapsed = GetTickCount() - dwTimeSent;/ s) O; v$ W: h" [$ h# K& O
            str.Format(_T(
"Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"
),
/ q1 B( H1 f! R2 t3 C- ^8 E                nLoop
+1
,
& I  a0 r% e. \3 D) _& F                   CString(inet_ntoa(saSrc.sin_addr)), : n, D6 Q- \4 V) D9 c0 }, S
                   REQ_DATASIZE,
# z4 Y1 _( Y* A$ ~                   dwElapsed,# a' g4 T0 m, ?5 _
                   cTTL);0 e. c5 U/ Z; A$ G% M
4 {8 ^8 j+ _8 b
            :postMessage(m_hWnd,WM_MSG_STATUS,
2
, (LPARAM) AllocBuffer(str));5 N0 m  i) X9 ]0 i( j: l
: `0 H8 P" i# z) m1 D& J
            Sleep(
1000
);# s# L' K2 o2 R2 B8 q/ s% V  z
        }
" y# s- m$ {7 Z" g, V    }6 N* v- B( c# ^4 F
    , f& e7 Q/ s! H/ Z4 c6 I2 }
    :postMessage(m_hWnd,WM_PING_END,
0, 1
);
5 q5 ]; O$ k& G, v- b  q8 t5 i. {) d
    nRet
=
closesocket(rawSocket);
" h. R5 o4 I; P* y' \- B4 A" x   
if (nRet ==
SOCKET_ERROR)
/ l: V2 J7 A  G6 W( }! K        WSAError(
"closesocket()"
);
$ r9 X. F" P& P! Q" g; ?. D8 w$ G4 s2 t% w- V3 Z
}
/ A/ S: f% q: b8 q* g* U5 \/ Y. \8 s
发表于 2009-3-13 21:41:27 | 显示全部楼层
:confused我很想尽全力帮助你,但是我什么都不会
# O+ u' \) M1 \4 t6 I/ C纯粹帮顶,顶LX个肺。
发表于 2009-3-13 23:00:12 | 显示全部楼层
WSAGetLastError()
 楼主| 发表于 2009-3-16 10:40:20 | 显示全部楼层
:(问题仍挂着 没得到任何解决  ; F. x! `: R+ C8 r( N- G, n
  这几天为它快同疼死了
发表于 2009-3-16 12:25:21 | 显示全部楼层
代码的东西我也爱莫能助。。顶下。。
发表于 2009-3-16 13:18:32 | 显示全部楼层
。。。VC没搞过。。
, `9 v+ T$ E' y/ o, E! s有没有试试直接输入本机127.0.0.1是否可以正常呢?
发表于 2009-3-16 13:43:27 | 显示全部楼层
代码方面我是什么都不懂
发表于 2009-3-16 18:22:55 | 显示全部楼层
你要学会调试错误啊~9 q/ n( @* l  j
核心编程第一章不是在说GetLastError函数了嘛难道我还要很明白的跟你说WSAGetLastError是WinSocket下的GetLastError版本?
: g4 _$ l$ ]8 v4 l3 A5 `至于那时候我为什么叫你看核心编程P6是想让你知道获得的ErrorCode可以用Error Lookup工具来查看信息的吗: a  S8 w6 _: ~" }) Q5 ?
要知道这工具是只有VC++下才有的工具- -那那些VB啊 delphi为什么没有呢 好吧 不解释2 Y7 w  ]" ~( \' u( m
如果一个程序员连自己解决问题的能力都没有,在谈何XX呢
* k6 |4 [! U2 z/ l6 S何况我已经跟你说用WSAGetLastError,谷歌一搜一大把啊1 }1 D' J. X3 r2 q% o: q7 h2 S
http://www.google.cn/search?client=aff-cs-worldbrowser&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=WSAGetLastError
! n: \3 ^. {8 @  i- `7 U- E$ M1 O! S* L
我建议你好好把核心编程第一章好好看下吧....(虽然你说你看过- -)
 楼主| 发表于 2009-3-25 18:34:32 | 显示全部楼层
这个程序的问题已经解决
% {. Q3 H" Z3 q) S, ^7 k 目前遇到另外一个路由程序问题~·
8 H# ^) N# S$ l- a  我把 WSAGetLastError(); 函数放在疑似有问题函数后面~· 设置断点, o* A; m9 Z7 u# z
查看了下.. 吼 还真有所收获
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-22 14:58 , Processed in 0.052109 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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