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

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2009-3-13 21:31:26 | 显示全部楼层 |阅读模式
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑
/ T* Y2 E3 f, }/ R, b) L0 N4 y
6 C' A6 a3 ^% P# S$ y  D+ y9 |小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:" W3 }1 _; w! X! m! j

5 J8 h2 g0 |/ A+ }) ]% |* Q- M0 g3 T8 M( Z) o% d

" z' C( T$ A' _/ s% \
; k1 }$ k0 W, I% l
8 B( E9 {4 X* C6 _该问题让小弟头疼不已... 不得已才发上来求救下:0 a) ?5 i0 u8 I* A5 u
我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
6 s- _+ H  Y1 I" K" G  而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码,
9 f% {5 m7 g% c  C但是 在ping 远程地址(如
www.baidu.com) 就会出现找不到主机问题,
) P1 }2 x8 N/ Q+ r) G! Y& a经过我调试发现可能是pstrHost这个变量没转换过来....
3 F7 {2 l8 \6 z3 J. h  不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。* w: r  Q4 a7 f' E2 F
1 I7 A- y: `9 l1 m4 v7 r
系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。
" G6 ?/ y, y; V" u: n  X+ X% ^8 q
( T# ?) b& t/ R% X9 z
// ========以下为相关代码段====================+ ]1 h9 ^1 Z2 `* k) ]
% \) Y* V) a1 i8 ~2 S: S7 |3 _
void CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)
0 P4 ?: B- g2 `{
# V" J# p. I% n. s1 n    SOCKET      rawSocket;
  c  @4 X+ |4 ]3 Z9 }    LPHOSTENT lpHost;
* f; b- r% g  j$ p, E, G' |( h0 \    UINT      nLoop;
7 e, ^) M) k, N8 c   
int
       nRet;2 N9 p- y" x8 K( ?
   
struct
    sockaddr_in saDest;
5 v1 f3 q2 g4 w   
struct
    sockaddr_in saSrc;
/ ]& o7 k# t2 R. m    DWORD      dwTimeSent;
0 J: N: s& S' H' c    DWORD      dwElapsed;' z: E' _& Y+ Y' T9 ?
    u_char    cTTL;3 @* w( \7 o9 q# G/ O1 G1 y5 A  o- S$ c
  t$ }% x9 y6 q$ \# ]
6 _5 [5 s+ b/ @
    m_hWnd
=
hWnd;! x3 o" ~; @$ q- _

2 @) E" C: d- S# v2 p% k    CString str;% y6 X3 \& X0 L& e$ h7 ^

/ r6 {, D; Y! j- s; i    ASSERT(IsWindow(hWnd));# `4 W( V0 Z; Z- A8 L) }/ h$ Q
7 l5 Z" i" ~( e
   
//创建一个Raw套节字

3 E. i) V1 o6 u- c    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);6 I9 p) x% {$ W6 W+ z- |% L' t
   
if (rawSocket ==
SOCKET_ERROR) : y* t2 Z2 G/ g$ |8 G
    {
6 P! e  t% @+ n6 E3 G! J  ^- l        WSAError(
"socket()"
);- j' Q9 g' E* `) E
        
return
;
9 ^) @5 [! O! s3 o/ G    }
7 t9 {5 {+ B& Q! O% x3 _1 E   
: P% b  T) a4 A( W  ?   
//获得主机信息
: E6 i: l7 w, S7 C$ y
    lpHost = gethostbyname(pstrHost);
8 w; w, X% l+ A$ _2 ~. ~& Z5 s; {; w+ i
   
if (lpHost ==
NULL)
2 n* V3 e0 K* r, c3 K    {
5 n+ l8 v! ]& H9 K, A$ e: [        str.Format(_T(
"Host not found: %s"
),w);1 B7 ?" G/ J. W3 ~9 C
        :postMessage(m_hWnd,WM_MSG_STATUS,
0
, (LPARAM) AllocBuffer(str));5 K2 v& t; R* R
        :postMessage(m_hWnd,WM_PING_END,
0, 0
);: v1 q/ z5 j4 h" E: O) U+ \
        
return
;
# z. Q" T7 x2 F8 H; j    }
! r! i. x- z* s, X3 G    9 _. M6 u" w( X- x% b% K( p
   
//构造目标套节字地址信息
  k/ O" q7 H: a4 Q: [
    saDest.sin_addr.s_addr =
' [) S& k1 u/ x, I9 c1 D9 S*((u_long FAR *) (lpHost->
h_addr));
- J  k" Z4 K' W- J! F' R    saDest.sin_family
=
AF_INET;
. y+ j7 |7 O# C1 Q' f2 n3 U3 c0 ?    saDest.sin_port
=, _# p0 w5 g8 S8 G3 Q
0
;) C- c8 l* g) x9 d0 D/ H, t0 t

& i4 `4 d5 J4 [* J   
//告诉用户我们现在的工作

- T# L5 {5 n( \1 j% U6 H    str.Format(_T("Pinging %s [%s] with %d bytes of data:"),
0 h- q. ~1 q* }9 a# k, U                w,
. }2 H) u+ a2 V% u$ U; S% ]. L                 CString(inet_ntoa(saDest.sin_addr)),
( H2 T6 R$ j/ N. W$ K                REQ_DATASIZE);. E) z6 o0 o' z& \( h5 h
    :postMessage(m_hWnd,WM_MSG_STATUS,
1
, (LPARAM) AllocBuffer(str));
2 `4 _: s0 j$ }6 z: m
+ s) ?- x& d& |; ^' s2 e4 }   
//多次ping
% I5 J9 m$ E5 ?
, `8 V9 o' e2 ?2 h0 D
for (nLoop =
, |8 W+ u' I) u; }2 U0; nLoop < nRetries; nLoop++
)
8 W( D  Y$ ~  v    {! D4 ]& `9 |( O. B9 d
        
//发送ICMP回应请求

- X6 W9 a* A% ?! e6 H+ d3 b- `1 M        SendEchoRequest(rawSocket, &saDest);
) l6 J1 J9 o% c
' R3 X4 x, @# c. }% l        nRet
=
WaitForEchoReply(rawSocket);6 x) I) j$ Y# L$ v" C! p8 T, B0 [
        
if (nRet ==
SOCKET_ERROR)
6 `; t- v% w' F) ~) L        {- O# h7 q. {: Z8 q# c' j
            WSAError(
"select()"
);0 b" C7 `, Q! k) E# u9 ~. a
            
break
;
4 ~" a- @2 k4 K- \" U# D        }! D7 S; u. G2 H5 X* C: L1 I* y
        
if (!
nRet)8 p7 J! g4 u8 Y3 ~: @3 X; i4 C7 C
        {9 h5 Z5 e& j- E' s+ ]
            str.Format(_T(
"Request Timed Out"
));
- m" U5 k. h+ x! R            :postMessage(m_hWnd,WM_MSG_STATUS,
3
, (LPARAM) AllocBuffer(str));
: x. i. s0 p& n4 ~! E  ?% Z        }
& |1 |  K4 R  b- k' G        
else

# q3 \2 D3 R; c4 Z5 q+ k& m' e* @5 K1 _' n
        {
) c  e5 {! c8 e) G            
//获得回应
4 s7 J, P+ D5 H  E3 N( f" `9 y8 _            dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);
4 S, B! i+ P" p) E; V, t! F
0 j5 D$ ?! V+ s  {: E8 e& [& e            
//计算时间

% [% d$ z5 Q' b% J            dwElapsed = GetTickCount() - dwTimeSent;
: ]5 W  k! J) g; A4 q6 [5 J            str.Format(_T(
"Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"
), & B6 T2 B  ^' G9 h7 k
                nLoop
+1
,
5 y9 A( u4 N+ s9 J# R5 e                   CString(inet_ntoa(saSrc.sin_addr)), / q% r/ K# a: @, J4 M& ^9 w
                   REQ_DATASIZE,
8 M: j7 k0 z% J6 e$ i) W1 j4 D! U$ t                   dwElapsed,
$ e7 n% L" I# I+ b* T                   cTTL);
* {* ]; T/ O  f8 F# x, D* F# _3 ?/ f* t! B- n" d1 I& T8 K
            :postMessage(m_hWnd,WM_MSG_STATUS,
2
, (LPARAM) AllocBuffer(str));  X( K  l" C% Z. A1 M- w
3 ?: }! a' {5 e+ w$ v$ S) m) n1 I! f
            Sleep(
1000
);5 V9 `; w; D2 U
        }
5 O* M9 d  D% H) E    }
9 ?# ~% |7 i' K    ; b1 W- E* c) U9 {2 v; J* s
    :postMessage(m_hWnd,WM_PING_END,
0, 1
);4 t/ t8 {% |' i# Q8 Y( f1 Z
; C+ S0 k1 Z% ~$ z5 H
    nRet
=
closesocket(rawSocket);
. A: y* B- O/ o" R   
if (nRet ==
SOCKET_ERROR)
  ^7 O0 w! e4 \5 A        WSAError(
"closesocket()"
);
; W5 Z+ z# |6 @; [. j# B# p
* n! z0 O3 i& d5 i}
9 i' q+ \/ T4 ?" A& c
发表于 2009-3-13 21:41:27 | 显示全部楼层
:confused我很想尽全力帮助你,但是我什么都不会
6 ^3 k" p  I  Y9 ]7 s" L纯粹帮顶,顶LX个肺。
发表于 2009-3-13 23:00:12 | 显示全部楼层
WSAGetLastError()
 楼主| 发表于 2009-3-16 10:40:20 | 显示全部楼层
:(问题仍挂着 没得到任何解决  # P5 U& t9 k& I! ^
  这几天为它快同疼死了
发表于 2009-3-16 12:25:21 | 显示全部楼层
代码的东西我也爱莫能助。。顶下。。
发表于 2009-3-16 13:18:32 | 显示全部楼层
。。。VC没搞过。。/ L3 i+ g- i1 O1 Y
有没有试试直接输入本机127.0.0.1是否可以正常呢?
发表于 2009-3-16 13:43:27 | 显示全部楼层
代码方面我是什么都不懂
发表于 2009-3-16 18:22:55 | 显示全部楼层
你要学会调试错误啊~
- I4 @4 C4 i- o2 c1 c# d核心编程第一章不是在说GetLastError函数了嘛难道我还要很明白的跟你说WSAGetLastError是WinSocket下的GetLastError版本?& ^$ T( ^" D' y5 P2 h+ X
至于那时候我为什么叫你看核心编程P6是想让你知道获得的ErrorCode可以用Error Lookup工具来查看信息的吗
/ W6 T6 n+ T. ~/ k$ E# I要知道这工具是只有VC++下才有的工具- -那那些VB啊 delphi为什么没有呢 好吧 不解释, f- N% t9 Z' W$ u
如果一个程序员连自己解决问题的能力都没有,在谈何XX呢
% t5 D' U1 ^0 z8 h! n1 C何况我已经跟你说用WSAGetLastError,谷歌一搜一大把啊) w6 Y% ?2 O. b0 O0 `9 k
http://www.google.cn/search?client=aff-cs-worldbrowser&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=WSAGetLastError
1 G/ Q, e; K: B
+ n! D( p, |1 f/ S3 R我建议你好好把核心编程第一章好好看下吧....(虽然你说你看过- -)
 楼主| 发表于 2009-3-25 18:34:32 | 显示全部楼层
这个程序的问题已经解决; n  t8 {1 Y, f9 d3 s
目前遇到另外一个路由程序问题~·5 r) h( z. N: e: w
  我把 WSAGetLastError(); 函数放在疑似有问题函数后面~· 设置断点
. P2 L: X. Y/ V0 {- Z 查看了下.. 吼 还真有所收获
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 20:09 , Processed in 0.095385 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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