|
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑 + ?- D' |2 l/ P/ k: K8 g
s2 a# P6 a! n小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:
5 j. W% a$ Z: f) n
; k. X( L6 d& |7 `
2 X2 _& L3 H' N8 G2 Y; Q6 v: i; C+ v. s7 G- s$ \3 @
9 P: `( _. |( R' `
$ z; ^3 n! O& }5 l* ~- M. `5 ?" N! ~该问题让小弟头疼不已... 不得已才发上来求救下:
& N/ f6 V7 l) p u我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
2 {; G8 W4 u/ }( g3 L. u 而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码,
" g `& Z o/ W9 J4 r但是 在ping 远程地址(如 www.baidu.com) 就会出现找不到主机问题,
+ G5 x- s5 H4 ? x经过我调试发现可能是pstrHost这个变量没转换过来.... / v3 ~8 ~. J2 V. L: C! K" i# R
不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。
$ V; }: [1 n' F `* }4 N5 Z& X2 a# a+ H: p* g2 E4 _2 {( z
系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。) L' B2 Q0 i( n; }" `& a7 o2 |
* H5 h6 u3 X6 w; {
// ========以下为相关代码段====================9 ?' Z7 t0 p" p
! P9 n$ q6 K A0 V! D
void CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)7 x9 ^( H3 f v3 U! e
{$ ^2 F' f% x0 A2 ?2 B) W' w
SOCKET rawSocket;
* T! ^% z; a. ?+ C LPHOSTENT lpHost;( F* S& q( o, s, Z" d* \) I* a) }
UINT nLoop;
; ]5 U* a+ @+ S- R8 U$ S, g int nRet;
; Q; D/ p2 ~$ @; e struct sockaddr_in saDest;
* S. |( Z/ L9 W. q struct sockaddr_in saSrc;
, J* A0 S& P0 y9 ]: W9 e2 D DWORD dwTimeSent;5 X# I9 ~6 @8 [" t% Z& G ?
DWORD dwElapsed;/ b( K" j+ t% _6 e! m! a9 \
u_char cTTL;5 P" D" N1 U" Q3 f% ?8 h5 m
4 [- t* o' M: V, l$ V2 c- O& Y! d. k% m2 u
m_hWnd = hWnd;2 @& ~7 O4 {, N% L4 D& E1 X/ r) J: \4 K
0 |: j* _# Y- E- ~( c- a4 Z CString str;
/ D1 G; s+ S& t* g
3 ]6 i( C8 h: V6 ^3 X* I- Q ASSERT(IsWindow(hWnd));
* r0 N2 M' j" v7 `
; x) E- ~" y5 }) \ //创建一个Raw套节字6 g% ?0 g; G* a( t/ i
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);% O% h& h0 k. T" ?7 r8 y
if (rawSocket == SOCKET_ERROR)
6 e6 o4 O0 r7 f6 {; I) N {6 ~& E1 ]* c6 ~5 c0 o1 y
WSAError("socket()");
. ]3 D# K4 F# U% ^# h, @( K- [ return;5 A6 T# n5 E. ]' P5 m1 k* _
}
8 X$ K, {# {$ _' Z, v* W + h" H) B3 `+ X8 I! g8 K; O; |
//获得主机信息: Q8 e0 f1 U9 o5 \: G/ Q
lpHost = gethostbyname(pstrHost);! T3 K+ o+ P: w1 A/ n4 E; d
- g/ n1 e- S# s2 E7 f2 a if (lpHost == NULL)- ~, t, l P# ]8 ]& G' x
{
- X: s I2 {1 Q str.Format(_T("Host not found: %s"),w);
) D h) [( c! t |2 {& n/ k :postMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) AllocBuffer(str));
& E/ f+ N& ~+ O4 z :postMessage(m_hWnd,WM_PING_END, 0, 0);: p: I5 |/ B& n5 e
return;
) l0 i; r1 T2 d% u9 h- h }
+ z! d- H2 X& F6 Y( Q0 D" E8 X4 k
* K5 p2 d/ q9 i' Y //构造目标套节字地址信息
0 ]8 p, m0 A8 B4 r: R saDest.sin_addr.s_addr =
% D" ~' \5 N* b) u*((u_long FAR *) (lpHost->h_addr));
9 m4 P; `4 b0 A6 n: `6 ~% G saDest.sin_family = AF_INET;9 c& F# f1 ~6 t m ~7 P
saDest.sin_port =
. Z4 F9 h. I8 _0;+ P+ s, y: p6 q/ i9 d& Q
# ]9 i3 A T4 j1 F5 Q- g
//告诉用户我们现在的工作$ s# V2 b1 S. X4 L6 p# Y4 o# O
str.Format(_T("Pinging %s [%s] with %d bytes of data:"),
# M% E, x9 m' Z. i5 v! \ w,
8 j3 s9 |$ h: f9 ?, Y CString(inet_ntoa(saDest.sin_addr)),
3 q" F) m- Y4 l7 C# h* Z REQ_DATASIZE);0 D) m" B: O$ u
:postMessage(m_hWnd,WM_MSG_STATUS, 1, (LPARAM) AllocBuffer(str));
' m4 ]/ S% B- z; h/ F1 ]" F! X+ x1 @) U0 R; e
//多次ping$ q' {3 L' B7 F% y% B) m m4 U
& F9 }# _9 c5 F& w) I
for (nLoop =) R1 i' k' R0 C( K: Q2 m
0; nLoop < nRetries; nLoop++)
1 }) X- t7 [; q( N: i {
4 U, d3 T& }5 |; Y% _% J7 t; { //发送ICMP回应请求) L3 h4 t+ ~$ J
SendEchoRequest(rawSocket, &saDest);
" U+ u4 G9 |; e& h8 W: A; G8 q! ]$ ], r, g( _2 ^
nRet = WaitForEchoReply(rawSocket);
' I7 G x0 X: o; y. E if (nRet == SOCKET_ERROR)+ {0 i; O' \4 X0 M8 f/ r# @
{
, T$ K7 K0 g$ X& C9 i8 i% G5 o WSAError("select()");1 G* U4 E' i* f" v
break;
$ L& y- h+ V# H5 H- Y! @! Q }9 e7 G- l+ k5 q3 r, a& B
if (!nRet)$ s) l$ Y+ M* [- a4 v: I
{; H$ O k5 _% H
str.Format(_T("Request Timed Out"));0 f7 r9 Z: q/ P$ |0 w& Y* |" c
:postMessage(m_hWnd,WM_MSG_STATUS, 3, (LPARAM) AllocBuffer(str));
7 n( c5 o7 m2 R0 S8 u2 _! m& P }5 a4 ^: w8 W6 f7 ^& h5 Q
else
) q9 E1 U6 p9 S+ \6 @
9 ]$ t0 P! P9 M* K, \% S5 k8 m5 c {
$ t7 J2 K- m) P: @2 p) @/ o //获得回应
5 Q! R" ~1 M6 x+ I5 ` dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);8 n i1 @# i8 S% Y
8 e- Y( K% X7 B8 Y% `' E6 |, l+ k7 I0 y+ A
//计算时间+ \* L% S+ m7 ^$ G+ C- x
dwElapsed = GetTickCount() - dwTimeSent;+ _4 r% P/ Y4 w) s6 v: ?
str.Format(_T("Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"), # U5 b/ |; Y l9 ~
nLoop+1,
8 T5 \( o: K. w0 @, | CString(inet_ntoa(saSrc.sin_addr)),
' j) V9 B1 Z! y6 L7 z2 P REQ_DATASIZE,3 K7 p {8 G6 V: }/ D
dwElapsed,/ X, b$ Q/ ~3 S+ ~. ]. |& h' V0 `- ?
cTTL);, l# s$ y& R4 A+ \
- i) m+ L* ^ Q% |( l+ Z3 I :postMessage(m_hWnd,WM_MSG_STATUS, 2, (LPARAM) AllocBuffer(str));
- f1 _3 @$ b* Y& Q3 x; ?
! @2 A- k8 b- ], _' N6 F4 P! M Sleep(1000); M) m1 Q' M- J1 T7 [* u
}
; Q& B& f6 k% z) |# _ }
' } p+ J0 s4 n( o
4 D# z8 Q( @( ]3 [' A :postMessage(m_hWnd,WM_PING_END, 0, 1);
" f! }8 E+ E% u; P% U( w- r! o) p9 x
% Q. g3 n, C1 g nRet = closesocket(rawSocket);/ |9 Z" s/ a$ y' F- M
if (nRet == SOCKET_ERROR)
' ~7 Z& C7 F7 r- f. t( N WSAError("closesocket()");
7 H3 _7 |, T0 H9 j3 `# |4 V! s' L! C# Y0 F% Y. ]4 M+ R
}
; `/ C) V4 ` o1 V- i |
|