|
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑 * j0 \+ K2 P) X l5 c$ {
' ^5 [- b9 ~9 a% q; b, ?6 w+ N小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:. }1 n* q1 D0 ~ J' E
- w3 K$ v8 d4 W
( `: }! }) }8 T7 a8 Q
/ ?* ?* Y* d0 B2 n; K$ y6 i X
/ \, y! A- l9 t9 W* t9 Z' G3 y
# C+ d6 B' @$ I* h) a该问题让小弟头疼不已... 不得已才发上来求救下:
" o+ A) Y4 K6 b( V% x; n我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
2 ~- f" A- t$ o: a4 e# b. ]# C* q 而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码,
3 j% ]0 D0 p: s- c; J' Q$ ^但是 在ping 远程地址(如 www.baidu.com) 就会出现找不到主机问题,
* b$ d8 T1 L8 ~) L% h! F! s经过我调试发现可能是pstrHost这个变量没转换过来....
2 F' h w1 f% K0 W* Z! Q 不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。0 @/ U# C$ g5 u; [% ~. f
R9 t9 _' v/ W" {; I3 n系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。- _* A- a8 W; W/ _
" I2 a6 {+ |3 @" {; A' c
// ========以下为相关代码段====================
! x( M% \7 C. c* N6 G
1 r! l2 N9 W7 K3 k; gvoid CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)7 `0 v4 Y5 O5 @9 P# W9 L
{
1 f3 U( G# G3 a M2 A* F SOCKET rawSocket;
- M( h: g, q' @! O LPHOSTENT lpHost;
0 N6 B1 O0 D, o& h1 i5 J6 B: | UINT nLoop;: @. q0 v3 L8 j: v C7 t
int nRet;
2 Q1 }1 T( f* o* B+ l0 U struct sockaddr_in saDest;
& Z! o0 F1 {6 |1 [$ o( }$ Z2 b struct sockaddr_in saSrc;/ q# x" I7 N& }% w/ }7 ~$ n) T
DWORD dwTimeSent;
: X+ E; `! L3 b' {: N3 U DWORD dwElapsed;
1 Z6 P2 g4 L# M* I' {( t u_char cTTL;3 w4 Y/ W! k! P! M
( B G. ~/ [1 t$ k+ h; V5 m
: f, D# d6 w* l/ ~8 K
m_hWnd = hWnd;
* b: q7 T' G! E- q- A* P) v0 o0 p+ u/ ?
CString str;! I2 u2 |4 V% e+ c3 p9 F( Z3 x
! p. o/ a$ A2 V$ z$ n0 d' |, [ ASSERT(IsWindow(hWnd));; i% W- }. m" X& y3 B- V
) P' X. x- C( h8 s3 \ //创建一个Raw套节字: y' p4 K. c* `
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
. i2 _; S c+ w1 }* g if (rawSocket == SOCKET_ERROR) 4 q7 [: E2 A* f# l0 A& l8 E# g# ]
{
9 X _2 G" r- V6 [1 P WSAError("socket()");
+ r: s: z4 m0 Q6 V! o. R return;
' w4 G+ q; l5 n! J! p# X }! o: N. Y. o! O, M
) Y5 K7 y- K& R8 S //获得主机信息8 m$ E. P! l! E) ^% I$ C* k
lpHost = gethostbyname(pstrHost);2 u4 P; K* |+ Q+ c3 g0 `, w
* G+ w4 l2 D6 m1 g1 B6 f" A( |$ u, } if (lpHost == NULL)
; A# N: ?/ d7 ]& S8 J0 j+ r1 o {
: D0 H f4 G* |. d str.Format(_T("Host not found: %s"),w);
# w4 E# ]* n+ o, A4 [& B% U2 r :postMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) AllocBuffer(str));
' z& Q1 Y$ S9 p2 U) j8 s J0 y* e: g :postMessage(m_hWnd,WM_PING_END, 0, 0);( l8 `" O+ Y( f4 a) T, |
return;
0 H8 |/ }6 X5 O7 H: N! b }
% t4 ~# b$ Q$ @4 t / A1 I& F% Z" Y! Z) n4 e) i
//构造目标套节字地址信息
+ X- A/ f/ ~) v- C8 ~" Q/ w saDest.sin_addr.s_addr =
4 C d- `$ w( d+ N0 V*((u_long FAR *) (lpHost->h_addr));9 v( h% D9 r" l! w
saDest.sin_family = AF_INET;
" g9 r. M0 q m5 c9 P saDest.sin_port =( A. p! T: D! X: D* X7 H5 s
0;, @/ n/ x' z1 `* D0 r2 [
/ |, D1 Q6 }0 j: q8 y/ B" I //告诉用户我们现在的工作
( W! l: b3 c/ i6 j; t& r$ D str.Format(_T("Pinging %s [%s] with %d bytes of data:"),+ |, e: c; K, Q2 A" p9 ?9 Z
w,
" h0 h1 L* |& E" }* T) o+ h CString(inet_ntoa(saDest.sin_addr)),
; Q& x1 O5 m3 i1 U: l, ^5 B REQ_DATASIZE);* ], S* a: H6 b+ k
:postMessage(m_hWnd,WM_MSG_STATUS, 1, (LPARAM) AllocBuffer(str));
: C( p5 y/ M4 r* l. _" |' s# Q7 g& R7 I2 W q
//多次ping) m. [, w: o U$ E, h2 Z& j
* k2 ^9 _$ |1 B& c* ~( n3 G4 cfor (nLoop =0 O: E. G j4 _% z
0; nLoop < nRetries; nLoop++)5 L3 Y$ ?4 H5 C9 g/ z- _
{
! q# d4 v: `9 F3 G1 }4 R# V( j! D( Y //发送ICMP回应请求
+ O2 h/ n) ~! t$ f SendEchoRequest(rawSocket, &saDest);
, w9 r; r, `1 W4 q
1 Q' n# ~" Z, I5 B3 t6 P nRet = WaitForEchoReply(rawSocket);
b5 r* @1 F: |' R' n. b if (nRet == SOCKET_ERROR)* |% m: P5 A) U) w9 b e5 }0 D# M$ J
{% v0 U$ V5 ~9 h
WSAError("select()");
" O" }- o* j9 ]/ E% @ break;' ~& t# V3 t3 e. F
}
0 h/ X. X4 R4 m4 ^# [ if (!nRet)
6 a! }: @0 D- R0 u' Y5 m8 [. r {/ }5 X2 F ~% y. z& Y& i3 u. c
str.Format(_T("Request Timed Out"));8 Q; q; ]7 g1 R. p7 v ^
:postMessage(m_hWnd,WM_MSG_STATUS, 3, (LPARAM) AllocBuffer(str));
$ v- w5 v- _% {8 x$ {. A }
" |/ `$ j; v+ N& u) T else
% Z, j& A% E* r$ n- j$ L# I, [8 j7 Y1 b# r: G/ A
{- u# K1 X2 ? d6 h
//获得回应7 g, Y1 \8 D7 l0 `8 |
dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL); l9 G" u9 M$ a$ e( a2 m) l
1 G1 e8 B5 Y) j: [) w- f" O/ o$ Q5 f //计算时间
. x; _1 b2 T1 R# c: c9 p dwElapsed = GetTickCount() - dwTimeSent; ^. \/ x5 T/ p% }. b) J) N! \
str.Format(_T("Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"),
; B$ C+ a3 \" [5 n( s+ Y nLoop+1,
" D* S; s. o) Q( ^/ ^3 D j CString(inet_ntoa(saSrc.sin_addr)),
! j$ v& k& H y6 ]& s c REQ_DATASIZE,
! ?( h. k4 {0 |; {% V. L9 M ?8 \ dwElapsed,
* U3 s& p/ `0 t j5 V& r cTTL);
% y- K$ l0 V; P; C2 O( E7 y
1 E5 O9 H3 _; G4 N/ L* }: D :postMessage(m_hWnd,WM_MSG_STATUS, 2, (LPARAM) AllocBuffer(str));
1 }' ~2 c) @, e0 o
1 A. j, q6 N" O Sleep(1000);
8 [; U' J& h' u y, |( K2 o }
2 F: i g! N' V! H! M# h }4 `& n0 g' M1 w- Y
: ~. {: t' G4 `5 ~
:postMessage(m_hWnd,WM_PING_END, 0, 1);+ z: z$ X; d* {9 k2 ^' B8 D- F \
# w/ \5 @: D+ X/ R5 J- x2 Z4 h# g nRet = closesocket(rawSocket);
# _. ]" S) c# s, G5 ^" x) `. ]6 W if (nRet == SOCKET_ERROR)7 Z @* [0 B/ F, } u3 L; M
WSAError("closesocket()");
/ T$ M' @- p6 L
( u8 x$ @" ^$ ^( |: @}
1 v1 _7 R. C" j. t |
|