|
本帖最后由 琼ヾ苍 于 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
|
|