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