琼ヾ苍 发表于 2009-3-13 21:31:26

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

本帖最后由 琼ヾ苍 于 2009-3-13 14:36 编辑

小弟在编写一个VC的ping程序,要将其ansi 转换成 unicoede 出现如下图问题:

http://www.xuecun.org/attachment/200903/13/22626_1236950293JYG1.jpg

http://www.xuecun.org/attachment/200903/13/22626_1236950296xixc.jpg

该问题让小弟头疼不已... 不得已才发上来求救下:
我自己调试了下 目前面临的是 pstrHost 这个变量 我发现它仍然是 const char*类型
而且我这个程序 在 ping 本地IP地址时可以顺利 测试且不显示乱码,
但是 在ping 远程地址(如 www.baidu.com) 就会出现找不到主机问题,
经过我调试发现可能是pstrHost这个变量没转换过来....
不过我不知道如何 转换 用MultiByteToWideChar 函数转换也不成功。

系统学院论坛里有 会VC的高手告诉能帮忙 给些指导意见 谢谢了。

// ========以下为相关代码段====================

void CPing:ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)
{
    SOCKET      rawSocket;
    LPHOSTENT lpHost;
    UINT      nLoop;
    int       nRet;
    struct    sockaddr_in saDest;
    struct    sockaddr_in saSrc;
    DWORD      dwTimeSent;
    DWORD      dwElapsed;
    u_char    cTTL;


    m_hWnd = hWnd;

    CString str;

    ASSERT(IsWindow(hWnd));

    //创建一个Raw套节字
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (rawSocket == SOCKET_ERROR)
    {
      WSAError("socket()");
      return;
    }
   
    //获得主机信息
    lpHost = gethostbyname(pstrHost);

    if (lpHost == NULL)
    {
      str.Format(_T("Host not found: %s"),w);
      :postMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) AllocBuffer(str));
      :postMessage(m_hWnd,WM_PING_END, 0, 0);
      return;
    }
   
    //构造目标套节字地址信息
    saDest.sin_addr.s_addr =
*((u_long FAR *) (lpHost->h_addr));
    saDest.sin_family = AF_INET;
    saDest.sin_port =
0;

    //告诉用户我们现在的工作
    str.Format(_T("Pinging %s [%s] with %d bytes of data:"),
                w,
               CString(inet_ntoa(saDest.sin_addr)),
                REQ_DATASIZE);
    :postMessage(m_hWnd,WM_MSG_STATUS, 1, (LPARAM) AllocBuffer(str));

    //多次ping

for (nLoop =
0; nLoop < nRetries; nLoop++)
    {
      //发送ICMP回应请求
      SendEchoRequest(rawSocket, &saDest);

      nRet = WaitForEchoReply(rawSocket);
      if (nRet == SOCKET_ERROR)
      {
            WSAError("select()");
            break;
      }
      if (!nRet)
      {
            str.Format(_T("Request Timed Out"));
            :postMessage(m_hWnd,WM_MSG_STATUS, 3, (LPARAM) AllocBuffer(str));
      }
      else

      {
            //获得回应
            dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);

            //计算时间
            dwElapsed = GetTickCount() - dwTimeSent;
            str.Format(_T("Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d"),
                nLoop+1,
                   CString(inet_ntoa(saSrc.sin_addr)),
                   REQ_DATASIZE,
                   dwElapsed,
                   cTTL);

            :postMessage(m_hWnd,WM_MSG_STATUS, 2, (LPARAM) AllocBuffer(str));

            Sleep(1000);
      }
    }
   
    :postMessage(m_hWnd,WM_PING_END, 0, 1);

    nRet = closesocket(rawSocket);
    if (nRet == SOCKET_ERROR)
      WSAError("closesocket()");

}

胸毛着火了 发表于 2009-3-13 21:41:27

:confused我很想尽全力帮助你,但是我什么都不会
纯粹帮顶,顶LX个肺。

hyp 发表于 2009-3-13 23:00:12

WSAGetLastError()

琼ヾ苍 发表于 2009-3-16 10:40:20

:(问题仍挂着 没得到任何解决
这几天为它快同疼死了

戒律 发表于 2009-3-16 12:25:21

代码的东西我也爱莫能助。。顶下。。

Admin 发表于 2009-3-16 13:18:32

。。。VC没搞过。。
有没有试试直接输入本机127.0.0.1是否可以正常呢?

明天过后 发表于 2009-3-16 13:43:27

代码方面我是什么都不懂

hyp 发表于 2009-3-16 18:22:55

你要学会调试错误啊~
核心编程第一章不是在说GetLastError函数了嘛难道我还要很明白的跟你说WSAGetLastError是WinSocket下的GetLastError版本?
至于那时候我为什么叫你看核心编程P6是想让你知道获得的ErrorCode可以用Error Lookup工具来查看信息的吗
要知道这工具是只有VC++下才有的工具- -那那些VB啊 delphi为什么没有呢 好吧 不解释
如果一个程序员连自己解决问题的能力都没有,在谈何XX呢
何况我已经跟你说用WSAGetLastError,谷歌一搜一大把啊
http://www.google.cn/search?client=aff-cs-worldbrowser&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=WSAGetLastError

我建议你好好把核心编程第一章好好看下吧....(虽然你说你看过- -)

琼ヾ苍 发表于 2009-3-25 18:34:32

这个程序的问题已经解决
目前遇到另外一个路由程序问题~·
我把 WSAGetLastError(); 函数放在疑似有问题函数后面~· 设置断点
查看了下.. 吼 还真有所收获
页: [1]
查看完整版本: VC的ping程序编写问题..紧急求救