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()");
}
:confused我很想尽全力帮助你,但是我什么都不会
纯粹帮顶,顶LX个肺。 WSAGetLastError() :(问题仍挂着 没得到任何解决
这几天为它快同疼死了 代码的东西我也爱莫能助。。顶下。。 。。。VC没搞过。。
有没有试试直接输入本机127.0.0.1是否可以正常呢? 代码方面我是什么都不懂 你要学会调试错误啊~
核心编程第一章不是在说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
我建议你好好把核心编程第一章好好看下吧....(虽然你说你看过- -) 这个程序的问题已经解决
目前遇到另外一个路由程序问题~·
我把 WSAGetLastError(); 函数放在疑似有问题函数后面~· 设置断点
查看了下.. 吼 还真有所收获
页:
[1]