诚毅小家|集美大学生活【集美大学,诚毅学院,水产学院,师范学院,美术学院,财经学院,体育学院,航海学院,集美学村,石鼓路,龙舟池】

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1426|回复: 8

VC的ping程序编写问题..紧急求救

[复制链接]
发表于 2009-3-13 21:31:26 | 显示全部楼层 |阅读模式
本帖最后由 琼ヾ苍 于 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
发表于 2009-3-13 21:41:27 | 显示全部楼层
:confused我很想尽全力帮助你,但是我什么都不会
" h1 Y- g5 _$ m' o纯粹帮顶,顶LX个肺。
发表于 2009-3-13 23:00:12 | 显示全部楼层
WSAGetLastError()
 楼主| 发表于 2009-3-16 10:40:20 | 显示全部楼层
:(问题仍挂着 没得到任何解决  
9 d1 W) C  T5 R1 a8 i  这几天为它快同疼死了
发表于 2009-3-16 12:25:21 | 显示全部楼层
代码的东西我也爱莫能助。。顶下。。
发表于 2009-3-16 13:18:32 | 显示全部楼层
。。。VC没搞过。。% K; L/ Q1 d  a  p: W
有没有试试直接输入本机127.0.0.1是否可以正常呢?
发表于 2009-3-16 13:43:27 | 显示全部楼层
代码方面我是什么都不懂
发表于 2009-3-16 18:22:55 | 显示全部楼层
你要学会调试错误啊~# m$ h" X. E/ |* }4 }8 A, Z
核心编程第一章不是在说GetLastError函数了嘛难道我还要很明白的跟你说WSAGetLastError是WinSocket下的GetLastError版本?
1 ?* J" k7 _) X. _' Q$ M至于那时候我为什么叫你看核心编程P6是想让你知道获得的ErrorCode可以用Error Lookup工具来查看信息的吗: x! P, ]2 a+ }# a" }
要知道这工具是只有VC++下才有的工具- -那那些VB啊 delphi为什么没有呢 好吧 不解释! u+ {. D8 @" F5 }
如果一个程序员连自己解决问题的能力都没有,在谈何XX呢
9 @+ C# P5 U+ u- @0 u8 Y何况我已经跟你说用WSAGetLastError,谷歌一搜一大把啊3 i6 C: D+ j: `+ O3 }
http://www.google.cn/search?client=aff-cs-worldbrowser&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=WSAGetLastError
2 X2 m; B3 S7 G/ D+ ^1 N
% c1 l% E8 R$ b) o+ C7 S我建议你好好把核心编程第一章好好看下吧....(虽然你说你看过- -)
 楼主| 发表于 2009-3-25 18:34:32 | 显示全部楼层
这个程序的问题已经解决
. c8 E' T2 V( [9 F8 r8 S4 X 目前遇到另外一个路由程序问题~·
' l- ^1 {$ X+ M$ y/ i( I  我把 WSAGetLastError(); 函数放在疑似有问题函数后面~· 设置断点
" r/ s- l! s& \ 查看了下.. 吼 还真有所收获
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|诚毅小家 ( 小家社区工作室 闽ICP备05007965号 )

GMT+8, 2025-2-22 17:10 , Processed in 0.052017 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表