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

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2009-3-13 21:31:26 | 显示全部楼层 |阅读模式
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑
# n4 |& q' W$ Y$ D$ Y* g  E& C; P+ T5 o! ]
小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:8 w( O) ~% @- K0 S- L6 e$ k, v2 G
2 V6 d- g9 s/ ]1 U

' a6 o1 W6 Y: A, k! ~+ @# i! n! ]& i& Q
" N  V- Q5 J6 f8 y* ?
# S5 Q' B; D2 v) ]; |4 {& m" ^
该问题让小弟头疼不已... 不得已才发上来求救下:' O$ N8 _. H$ n, W2 r" X5 Q9 E
我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型 * s$ Q5 N" K, z* N: v
  而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码,
! S1 t9 c8 M5 `1 n但是 在ping 远程地址(如
www.baidu.com) 就会出现找不到主机问题, / U/ f8 P' N$ R$ g
经过我调试发现可能是pstrHost这个变量没转换过来....   D2 U  I$ t" ]% ]2 X% l8 b
  不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。/ S( m3 n. c0 a" ~( l  W

% g+ @. K1 E7 M) [2 A系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。
9 \& l& ^# Z9 v
- n. l8 Q. Q( z4 \, V( X/ H
// ========以下为相关代码段====================2 j; U$ x: v' @% a  s9 E9 t, i

5 ]4 s0 X& S4 b/ \; ^void CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)
9 k2 O" j+ U8 a. X{2 u0 ]! }. W( i3 U
    SOCKET      rawSocket;
! {6 |8 N1 T& H) h5 m    LPHOSTENT lpHost;
( C5 s! ^* B- s9 K* m    UINT      nLoop;) ?: ~4 U; \7 D8 T1 I+ [
   
int
       nRet;
0 b( z$ Z$ [, M% w  B7 e- F# `: P! h   
struct
    sockaddr_in saDest;
7 Z/ D4 b# E& E  }   
struct
    sockaddr_in saSrc;
7 \" ?# n" B& H& h! ?8 P( G/ Q; P    DWORD      dwTimeSent;
) E4 V+ ?+ T' d, C# P) b. x1 y  y& t    DWORD      dwElapsed;! X  n2 Q& D6 N9 T, O* H: ?; j2 R
    u_char    cTTL;
7 j# P1 m. g. d/ O6 N8 {4 x$ R5 G3 i
: }" a! X9 F# p* v0 N  m. r
    m_hWnd
=
hWnd;6 \) G& _$ l& s! ]
) w3 ~7 s8 k* Z
    CString str;
! Z1 M! v( J2 w7 ?# `% r: {0 M# A- u% Q4 q: m* K: T
    ASSERT(IsWindow(hWnd));
/ v) T6 _- M6 h7 r4 U0 M) Z  f5 R# R# A$ ~, c3 u
   
//创建一个Raw套节字
  R; X$ g* t4 S
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);7 u8 w5 [- c' K
   
if (rawSocket ==
SOCKET_ERROR) & ?6 r: V- W: h7 K! ^: c9 \
    {
: H& B$ j/ i6 V1 p        WSAError(
"socket()"
);5 d# b! n0 {: G6 S
        
return
;
) K9 ]" l6 R- c, y    }; ?3 S; M5 Z: ~  V- N: |. u
    ( C6 O" W. u0 Y3 r' N7 i! V
   
//获得主机信息

2 Q& a, K! |: K, f3 v    lpHost = gethostbyname(pstrHost);
9 T& U2 w: H2 R) q: w" d. ?0 c1 Z1 {+ w6 L
   
if (lpHost ==
NULL), n. Y5 w0 }. |; ?+ H
    {  R4 ]) T! Y6 j2 K; i' \: x
        str.Format(_T(
"Host not found: %s"
),w);
3 {$ d8 z2 Y( B" `, d9 D        :postMessage(m_hWnd,WM_MSG_STATUS,
0
, (LPARAM) AllocBuffer(str));3 M& W/ c1 ^2 t; v( ?
        :postMessage(m_hWnd,WM_PING_END,
0, 0
);
, \4 M  ~+ o# w' t' U* G* [+ o        
return
;
9 ^* {: O/ ^) d    }
. ]9 ]0 t& }8 l" Z* v1 l) h; O   
8 O$ J* P/ X; \  v, p: j   
//构造目标套节字地址信息

& S2 R/ {% u. w6 e, E# G    saDest.sin_addr.s_addr =
; z) j( W0 v; V+ X2 Z5 `& B/ e0 C3 ?*((u_long FAR *) (lpHost->
h_addr));
3 [  n, o' |$ }+ p" u1 a9 j' R    saDest.sin_family
=
AF_INET;' Y; p" ^  F2 T$ F
    saDest.sin_port
=
% I( @0 Y. u. p9 c% [: C  }0
;
7 T( \. B$ ^4 a' r. q8 ]. Q& @. l# T
/ p9 C$ }! S0 @   
//告诉用户我们现在的工作
9 n: ~$ O- v4 j0 ^" g, D+ g
    str.Format(_T("Pinging %s [%s] with %d bytes of data:"),
6 W0 e3 @8 C! c- ?0 d                w,+ o6 o( e% A2 O6 i; n# l
                 CString(inet_ntoa(saDest.sin_addr)),
: v/ f( J* E- F' t* m9 T- m                REQ_DATASIZE);
/ H: L$ P( M/ o3 P1 F. D) E    :postMessage(m_hWnd,WM_MSG_STATUS,
1
, (LPARAM) AllocBuffer(str));
' B- G: t, c$ S, W* k! z" l' r0 M. `$ i# n+ C
   
//多次ping
! p6 b& T# v. d4 L. i

" Z! K! f+ l; h) Nfor (nLoop =6 B8 o& V9 M, n5 @! c  R5 [
0; nLoop < nRetries; nLoop++
)
" N6 a4 C, Q& @% n. T& i8 U    {
! X$ K: l' q1 a& h$ [        
//发送ICMP回应请求
# K) C# z/ X5 g% H
        SendEchoRequest(rawSocket, &saDest);$ m3 E$ p# V  i' f( |! f
  F. ~7 g3 F8 M: I
        nRet
=
WaitForEchoReply(rawSocket);
) o& U* L; }: C; |8 M4 x  c        
if (nRet ==
SOCKET_ERROR)' U( `" T  T0 s. C7 |
        {3 h  _1 U6 r: [0 i7 P9 {1 Q- C) p
            WSAError(
"select()"
);' T  ~& Q0 c# Q' k) O- a  L
            
break
;9 ]2 n: r- {" D+ A$ b/ o. s9 o! j4 S
        }* w( k( W0 N# u) G6 n$ g
        
if (!
nRet). [- [" U1 S# _1 Z% v7 J4 [; a
        {
+ ]' a1 c! {* I4 I            str.Format(_T(
"Request Timed Out"
));$ F- Y/ e; T$ D5 c
            :postMessage(m_hWnd,WM_MSG_STATUS,
3
, (LPARAM) AllocBuffer(str));5 M: K, h; i. e4 @; a6 s3 t, O) A
        }3 m4 @$ Y# B" g) N
        
else
: w: W7 @" ?4 a& V* g* n+ f

" b2 f( ?$ y/ ?, k% V4 b$ G        {# u, i, w3 T! h3 C. w9 V5 G5 b
            
//获得回应4 g: a) m! m+ ^4 f
            dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);
: Z* e; b$ X) D6 X0 z
! P! A' Q* S+ ?            
//计算时间

# w3 N- h$ _( a* c" ~# l            dwElapsed = GetTickCount() - dwTimeSent;" \( s3 L' T1 N: C- @, ~. O
            str.Format(_T(
"Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"
), ! p' ]+ d: k1 n# J/ ^
                nLoop
+1
,
# S  }7 ~/ n3 A8 \/ w5 o                   CString(inet_ntoa(saSrc.sin_addr)), : T: H8 d( }  P- n/ w+ h
                   REQ_DATASIZE,1 `5 v2 K. J- g8 T  r/ E
                   dwElapsed," w/ G% ]8 i; V1 @* a" Y. H
                   cTTL);
' X/ ]; q! R" ^9 a, l" n% S1 q+ g: d( ^$ F. g7 b+ P
            :postMessage(m_hWnd,WM_MSG_STATUS,
2
, (LPARAM) AllocBuffer(str));
" e( f6 a- z  y6 U
1 {7 u% \  C, u6 O1 M+ E5 \; d            Sleep(
1000
);( y- Q8 a9 w% I% Y* ?
        }# J" A2 S& z' y: D2 K/ E: S
    }
- s  Q' f) |+ z; Z  A. t   
8 n* M& w5 q. f; ~& Z- X+ L( L    :postMessage(m_hWnd,WM_PING_END,
0, 1
);$ p$ b& d- o3 q7 u9 h5 o" a

7 u6 Y+ p' X. i    nRet
=
closesocket(rawSocket);  [/ U) G+ E$ C+ ?3 }7 |5 x2 u
   
if (nRet ==
SOCKET_ERROR)2 |0 y; j" S  g- V7 G9 g  j
        WSAError(
"closesocket()"
);
9 S' x* T" z! P; n) l. b/ ?% o# h$ d
}
/ O8 c5 e$ \. Z$ ]
发表于 2009-3-13 21:41:27 | 显示全部楼层
:confused我很想尽全力帮助你,但是我什么都不会
. e! i6 N4 u. q纯粹帮顶,顶LX个肺。
发表于 2009-3-13 23:00:12 | 显示全部楼层
WSAGetLastError()
 楼主| 发表于 2009-3-16 10:40:20 | 显示全部楼层
:(问题仍挂着 没得到任何解决  5 [& r  v4 v% F7 v8 C" K& X( z4 ?
  这几天为它快同疼死了
发表于 2009-3-16 12:25:21 | 显示全部楼层
代码的东西我也爱莫能助。。顶下。。
发表于 2009-3-16 13:18:32 | 显示全部楼层
。。。VC没搞过。。
! K1 u; t- B% a+ _% t0 Q& Y! n有没有试试直接输入本机127.0.0.1是否可以正常呢?
发表于 2009-3-16 13:43:27 | 显示全部楼层
代码方面我是什么都不懂
发表于 2009-3-16 18:22:55 | 显示全部楼层
你要学会调试错误啊~
! n8 m4 V0 a3 p: |核心编程第一章不是在说GetLastError函数了嘛难道我还要很明白的跟你说WSAGetLastError是WinSocket下的GetLastError版本?
) c, }' ]  H. B& {  N  h- ?至于那时候我为什么叫你看核心编程P6是想让你知道获得的ErrorCode可以用Error Lookup工具来查看信息的吗. l! B4 Y% n' r' ]( [  ^
要知道这工具是只有VC++下才有的工具- -那那些VB啊 delphi为什么没有呢 好吧 不解释$ B. }" `7 m9 X
如果一个程序员连自己解决问题的能力都没有,在谈何XX呢
: V/ {# g6 g( W6 Z何况我已经跟你说用WSAGetLastError,谷歌一搜一大把啊9 f1 }4 u# ~  B( s
http://www.google.cn/search?client=aff-cs-worldbrowser&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=WSAGetLastError( Z! a6 E  A* I8 Q, B& l. V. b

) q/ L$ B7 b$ p9 t; j; a* |我建议你好好把核心编程第一章好好看下吧....(虽然你说你看过- -)
 楼主| 发表于 2009-3-25 18:34:32 | 显示全部楼层
这个程序的问题已经解决
/ X3 K" w  o. H; t$ E% ^8 c 目前遇到另外一个路由程序问题~·+ _9 V6 e# J3 ?
  我把 WSAGetLastError(); 函数放在疑似有问题函数后面~· 设置断点9 a) |- G) ~0 E8 P0 W$ U
查看了下.. 吼 还真有所收获
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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