|
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑 , d: }2 M, i9 K$ }( P( F
& v) @9 m2 _* I
小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:% B0 c8 z5 T7 h: e1 O" a% j: J
; q7 g& j# f& g, W/ X2 ?
) |& W- }. ~. E
s. ~% H' f5 ^ o, a6 t
) q: f- H2 o8 B7 ]/ T3 h7 X; t4 H$ b8 s4 r; c1 I0 t7 b
该问题让小弟头疼不已... 不得已才发上来求救下:9 l' E, ^+ P# W
我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
/ }9 ^7 [$ h8 x' h) q 而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码, * D3 p$ Z1 @5 v" e
但是 在ping 远程地址(如 www.baidu.com) 就会出现找不到主机问题,
; ]; u, G% m) B2 d' b% A" ^经过我调试发现可能是pstrHost这个变量没转换过来....
H8 j) a7 W7 U( w: \ 不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。
# Z9 v0 {. S# f1 ?$ h+ _: v% T- }) R! v9 G# c* ~& Y
系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。& X. Q* [0 l9 M8 x
/ t0 K6 X% Z, d// ========以下为相关代码段====================+ S" n- Z9 m7 G
, _; Y6 s9 k# u+ K! a7 s
void CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)! N; x. K0 K8 p' _0 k# V5 a4 o
{
. r* X o; t7 F. O% k2 o; ] SOCKET rawSocket;, f! t2 F& m$ W: Q A/ J
LPHOSTENT lpHost;
: ]: r# ?& I/ d2 Y- I$ T, F UINT nLoop;/ L5 U6 a p+ k, |9 _6 K
int nRet;5 p$ e/ K$ p3 `' t' ~4 i
struct sockaddr_in saDest;9 q3 R0 _+ e" T
struct sockaddr_in saSrc;
3 D% l" c2 E( ~6 b& [7 V5 V DWORD dwTimeSent;# L& T9 R5 m2 J3 f) x
DWORD dwElapsed;% }) @4 X& J8 l- D! u
u_char cTTL;2 a/ T$ L+ H6 z6 k5 J
; s8 W$ r& Y/ J. n6 a2 l( {; }
- a' `$ r/ w. B. }3 C1 p m_hWnd = hWnd;
) g+ J0 F7 C b- n" }, g8 j
' M' C+ Q, X' i7 g CString str;' o) I' z3 A9 f; t; N
8 u3 [$ X/ h1 e: f& W/ s ASSERT(IsWindow(hWnd));" Z5 B' j/ S9 T4 C; M D
. p5 q# b* G; N7 S: E
//创建一个Raw套节字- K3 { ?0 I" F: w+ I( a# w( _4 P! z
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);2 M9 `! G$ [! S( W; T8 N/ U
if (rawSocket == SOCKET_ERROR) 4 P1 E& A% b6 k0 d) d8 Q
{: b: d% N8 e0 j
WSAError("socket()");
# h8 K% i" G% K. i( s! `) X5 \ return;
* i X9 k& G7 m* @8 r }
1 O+ u: a9 Q! j* U' K' ^
" x; ^" y) Q. o //获得主机信息8 g, Q7 H( C) I2 u; e, L. Z, z
lpHost = gethostbyname(pstrHost);2 A: j' Q6 R5 \2 ^
+ u, j% s. A0 p# j+ B
if (lpHost == NULL)! e6 g- Y' I3 f; X5 z6 v
{
. g+ |3 C# L' @$ @4 x, w str.Format(_T("Host not found: %s"),w);* Z6 j8 ^# c3 K- I4 z3 M
:postMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) AllocBuffer(str));
0 R; T) _5 N5 \+ u1 [4 N :postMessage(m_hWnd,WM_PING_END, 0, 0);, i' t. g$ B& C) B8 Y5 U! V& o E
return;* L; a; ~0 H- O
}
( S+ Q' }5 f; W: l* R' o" s 7 @5 D. s* f- ` ?3 E" x
//构造目标套节字地址信息
0 l) _9 l1 R* A5 B( C1 k saDest.sin_addr.s_addr =
* y' M* ^) h# [9 [. h! E# j1 i*((u_long FAR *) (lpHost->h_addr));
5 g) s" Q: M: w# A( F/ G saDest.sin_family = AF_INET;) m8 f+ y6 O+ v
saDest.sin_port =
! h: ^- k1 n4 W6 c* [. q0;
5 Z, _2 z i4 d" j3 t9 b J5 r
" d2 @6 @7 I2 g1 m0 L* X# Y //告诉用户我们现在的工作/ u. e) U- `4 Y* Z) ~
str.Format(_T("Pinging %s [%s] with %d bytes of data:"),6 V" w9 B* f7 X& p9 ^* |/ d
w,
3 x* K. F% P, y& w- v/ e6 C* L CString(inet_ntoa(saDest.sin_addr)),
/ X- m4 b Y: v% t7 N0 P* ^8 M REQ_DATASIZE);
% v B2 a% ^9 \- q :postMessage(m_hWnd,WM_MSG_STATUS, 1, (LPARAM) AllocBuffer(str));
| |$ ?- |9 R/ y- \1 d# ], M/ L0 \3 h6 n
//多次ping
: b! O- q7 c4 U+ g3 ^/ b
. h" T9 e+ z8 H$ l- y* v. lfor (nLoop =
9 }5 h, \' k! R0; nLoop < nRetries; nLoop++)
' N$ X0 e, t/ k( A! }% H {
6 x) v1 Q, w5 f" P& Z$ w //发送ICMP回应请求
, @# w1 h Q. @8 m9 m SendEchoRequest(rawSocket, &saDest);: K; B: y3 m; f& u3 H0 p
7 z" B G& {; ^" x) o
nRet = WaitForEchoReply(rawSocket);
/ i: D O6 t. c if (nRet == SOCKET_ERROR)
( A9 A+ `( c1 k& r {' W7 y" l8 X3 _& C- |5 E5 Q
WSAError("select()");4 b1 K4 W5 m- ^
break;
, i. N6 [& j L7 t0 C }8 w/ E2 ^) n/ T4 z
if (!nRet)
/ r% L. o& l; l7 F1 ^7 { {1 N8 X' j: _) z0 z! z% y
str.Format(_T("Request Timed Out"));
0 x& d: {5 z. |. ?6 w- ` :postMessage(m_hWnd,WM_MSG_STATUS, 3, (LPARAM) AllocBuffer(str));
5 Q" J P: k- X. S' u) i. J, \; Y }
! |- g+ D, X/ q$ L else
3 O3 w. S. c" @# H- O( r, q& y; C0 A* g5 |! Z
{
8 ^9 w/ H- b; L) Q4 k //获得回应
( ?, d$ L0 W* q( c9 t& ]- C dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);
2 f* A e/ y( h9 Z e, Y% H) B5 V, U$ o6 r0 t
//计算时间
5 e& }; {% j* F/ k dwElapsed = GetTickCount() - dwTimeSent;
4 P4 M5 Q" T8 o6 } str.Format(_T("Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"),
$ P, M7 Y; o* v* v* P- J( r& k: e nLoop+1,
* q6 t/ y( l3 R: G* J CString(inet_ntoa(saSrc.sin_addr)), ' ?* Q* f" L- E) d
REQ_DATASIZE,$ w; n: j: K$ i3 e5 B3 D3 k" ^
dwElapsed,
6 i% }. K6 K4 m, T cTTL);
6 m6 W( r% o) s, P: |" e
0 {1 v6 [% D, D- ?$ Q :postMessage(m_hWnd,WM_MSG_STATUS, 2, (LPARAM) AllocBuffer(str));7 {( a- |% ]0 ^: a& p1 {4 }
& I1 d" b. [5 p' d8 w& c8 F Sleep(1000);
5 ~ p# Y: ?( k( K' i | }
& H3 u6 j [) {! c }# y, R, [6 _3 [& x+ ~2 V% g
" U6 u' O+ G( K. j3 Q! e5 B3 w
:postMessage(m_hWnd,WM_PING_END, 0, 1);
# n! G M4 u* n" `) z4 g0 Q3 C* p2 @8 e$ V: c
nRet = closesocket(rawSocket);
! r k5 e2 `0 t4 K4 \# i" I if (nRet == SOCKET_ERROR); D/ {, d. y# _2 B$ w- t
WSAError("closesocket()");
; q; `& w9 S, M7 i
2 m, t( J0 ^2 A6 B}& d' L" C p6 G Z
|
|