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

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

本版积分规则

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

GMT+8, 2024-12-22 16:15 , Processed in 0.055509 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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