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