|
本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑 % N$ E; F. J; [" O! _( O1 P2 U& v
$ l2 y' W! E3 P/ h1 O# C
小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:* W6 Q& w8 Y: ?8 S. K: l
1 |5 @/ Z8 c) _7 i! I' a+ ^' l, N( w0 Y5 d! U1 n3 B {1 o8 d
: F7 q/ N3 T& Y J) s
. N$ M ^$ v5 [, }0 S
1 k" ~1 t; ~+ x* W9 i该问题让小弟头疼不已... 不得已才发上来求救下:
3 T7 C# n; B% ?4 v4 y我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
& E- |% o s \( V2 A+ O 而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码, : f, c5 x0 a k( u1 H# H4 L+ E
但是 在ping 远程地址(如 www.baidu.com) 就会出现找不到主机问题,
) ^. O: I3 h8 F% w: R经过我调试发现可能是pstrHost这个变量没转换过来....
- ]$ `# U$ L8 | 不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。
& M4 B( f- u3 m7 P: }' P
! T- e7 ?/ l: ~; h; A系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。- b, v5 i& A8 P- ~" T
+ X' n4 q3 U, x// ========以下为相关代码段====================
8 D: w% c0 m* f
/ T o7 \$ X9 n6 Uvoid CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)' S7 K5 }( F0 h: J5 I
{
7 s A6 f* K' W7 L, L( N SOCKET rawSocket;
! T8 f& [" c; Q) U LPHOSTENT lpHost;0 r6 w, K- m. y6 \! `
UINT nLoop;
4 V. M' N8 {. b1 k. |) T int nRet;
' ]! ^. Y9 j; F9 m! @ d3 M9 Y struct sockaddr_in saDest;
8 k$ k' ]: u3 }1 u% \ struct sockaddr_in saSrc;
4 d8 U0 `$ s+ T r, V$ Z DWORD dwTimeSent;2 e3 ]: |& p! h& Y* W0 V9 N
DWORD dwElapsed;; B+ c+ W, T0 }4 X& o
u_char cTTL;
- W7 J7 L+ q6 F4 ?1 M
. z; T0 G B9 W& k8 m) i! D$ B( U+ k8 I' S/ {
m_hWnd = hWnd;
! ~" N$ i# @" N8 O) N; {% _' t* b9 Q1 S
CString str;
+ p. A: }1 n# I. j( ]# ^" \
* R7 [) K0 ` ~4 r3 Z ASSERT(IsWindow(hWnd));8 t. k7 q, t; e ^7 P5 z
- \/ D5 I% _- u B% U1 U
//创建一个Raw套节字$ a3 }7 @9 @0 C
rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
" q4 T7 E& q4 G3 {$ b if (rawSocket == SOCKET_ERROR)
" i1 J) {3 [& i! Z; Q {
' k* V$ H' M' J: _+ N WSAError("socket()");
]) y0 f1 S+ P' q' Z& K" Z return;
1 ]5 C& p$ b3 v5 Z }
" I; p3 G& \* g$ I" E # M! M. N7 R$ p; H/ Q
//获得主机信息& ]6 o. x% `4 L# _" a5 t
lpHost = gethostbyname(pstrHost);0 X {8 S. D, S/ C, e% P
1 u) N- A# N% s
if (lpHost == NULL)
' ~, [& [9 b L X {
6 b+ b! e% x: d* X& O str.Format(_T("Host not found: %s"),w);
) {, X7 V0 b. q0 ^, U :postMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) AllocBuffer(str));
8 g+ e. t( v# _" z- p1 _2 O7 ] :postMessage(m_hWnd,WM_PING_END, 0, 0); V) Q# N3 ^5 K9 P
return;
. M' a0 }2 d7 [; F* `. U }
1 M! f4 N; T/ t3 l% Z
3 e$ S0 H, ]. E5 L //构造目标套节字地址信息
4 S |, y9 |* `8 F9 |: [ saDest.sin_addr.s_addr =
' y0 N3 h0 T' m0 l( ?! h/ c*((u_long FAR *) (lpHost->h_addr));* k, p0 D8 O( A* N3 P& t
saDest.sin_family = AF_INET;# d4 a4 r+ b& N
saDest.sin_port =& V1 y8 Q* f+ v+ u" _, k
0;7 g1 }0 _" t2 ~8 U
8 f1 s4 D+ L$ f* |0 w" z' v6 j
//告诉用户我们现在的工作; O. Q; j( f L
str.Format(_T("Pinging %s [%s] with %d bytes of data:")," j4 u q4 } L/ l; @# s5 i i
w,
' s, E! }' m2 A CString(inet_ntoa(saDest.sin_addr)),. j9 `4 z6 K5 l( Q6 t$ \/ O2 w
REQ_DATASIZE);
! a# H2 ~' e* S# Z. ^4 x; u :postMessage(m_hWnd,WM_MSG_STATUS, 1, (LPARAM) AllocBuffer(str));
4 Z) |$ C2 @" i: n6 v$ G4 J" R% i2 Z c
//多次ping
2 j8 @" o! D) d M4 T
1 ]0 D! G( g( d! v& sfor (nLoop =
7 G4 A/ n, Y8 w. A2 G0; nLoop < nRetries; nLoop++)" S- Z: k( Q, E# H; \
{1 Y* \$ ^3 u+ a& t7 ]
//发送ICMP回应请求
b% f) @8 C, L3 M SendEchoRequest(rawSocket, &saDest);
& X# k; _7 o* G2 d
- `" W0 a' W" _: @* R8 A ~& H6 U! c9 _ nRet = WaitForEchoReply(rawSocket);5 b2 ^' Q% r: N6 C* w3 c
if (nRet == SOCKET_ERROR)( w& W7 v( B" u; G8 m
{
1 ?5 \4 n& \. K. p! U B& d( w! N- N WSAError("select()");" f! _/ _2 y( s
break;
& a7 x1 a3 g) q9 k }: ~9 w% i2 P( J8 z2 b
if (!nRet)
2 o5 w* F$ f' O& l" x+ @ {
2 f/ J8 d" ]# X2 y str.Format(_T("Request Timed Out"));
/ N4 \- X0 s0 \# g) |: o+ E :postMessage(m_hWnd,WM_MSG_STATUS, 3, (LPARAM) AllocBuffer(str));
' {1 _4 z' I) h! G. _ }2 F9 P9 i/ C0 v8 {8 n7 ?0 B
else' F6 {; o4 D# e6 c3 v0 T* n( @
7 ]2 ^) w2 H1 v$ a0 D/ B$ X# } {+ D) y; S i6 H; |) I
//获得回应; t8 ]( o- K$ N) g) [
dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);
& K, u" c2 U; C! |& |5 P0 Q) b, B8 F4 |' o- K, }% n
//计算时间
1 [' A; l L& A# u dwElapsed = GetTickCount() - dwTimeSent;
2 ? H0 }; l+ G5 U, {8 S str.Format(_T("Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"),
* }7 U0 ]9 [( F, M9 y nLoop+1,
7 r1 }4 d( |) X3 b CString(inet_ntoa(saSrc.sin_addr)),
, i9 u& D- R# f# M REQ_DATASIZE,
, w. ?! L5 T0 r+ x( R dwElapsed,& o, Q: j# @- Z! ?* f" T0 b4 ?: O: Y
cTTL);6 P% m. O0 r* `2 l9 r
?7 V: u/ F- ?& X; b1 `
:postMessage(m_hWnd,WM_MSG_STATUS, 2, (LPARAM) AllocBuffer(str));
7 z! k0 Y3 N7 D3 }6 n
, g G( N6 w9 l$ G- A Sleep(1000);
1 `) i0 r5 E6 @* L: ? }3 `, x# J. u5 @
}2 e* r) ^2 w& a; F* ^; A- ^7 u
7 |( H9 b3 u, k) P5 Q
:postMessage(m_hWnd,WM_PING_END, 0, 1);' C7 _% x. q. X: g L# P( v
3 k: o+ u- s5 B8 f1 I' A4 b
nRet = closesocket(rawSocket);7 a# ?" Z; @' Q
if (nRet == SOCKET_ERROR)
; k! ^( s9 W8 m4 e$ }" _ WSAError("closesocket()");# H) _9 ^4 f, Q! o6 ?
5 K$ q7 n3 V% h, `8 B3 p/ e
}" w L" _" o' K7 C8 h
|
|