吹膜机用的原料:急需一份ping的源代码

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/05 17:07:52
要求有实现的功能 运行过程

这是MFC写的!
下面代码只是其中一部分!基本上实现过程都再,要全部代码可以和我联系!

UINT PingThread( LPVOID pParam )
{
CThreadInfo* pThreadInfo = (CThreadInfo*)pParam;
HWND m_hWnd = pThreadInfo->m_hwndNotifyWnd;

SOCKET rawSocket;
struct sockaddr_in saDest;
struct sockaddr_in saSrc;
LPHOSTENT lpHost;
CString str;
int nRet;
DWORD dwTimeSent,dwElapsed;
u_char cTTL;
long m_laddr;

rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
while (TRUE)
{
if (WaitForSingleObject(pThreadInfo->m_hEventStartPing,INFINITE)
!= WAIT_OBJECT_0)
break;
if (WaitForSingleObject(pThreadInfo->m_hEventKillPing,0)
== WAIT_OBJECT_0)
break;
str.Format("读取计算机:%s地址",pThreadInfo->strHost);
::SendMessage(m_hWnd,WM_MSG_STATUS,0,(LPARAM) LPCTSTR(str));
m_laddr = inet_addr(pThreadInfo->strHost);
if (m_laddr == INADDR_NONE)
{
lpHost = gethostbyname(pThreadInfo->strHost);
if (lpHost == NULL)
{
str.Format("计算机名字无效: %s", pThreadInfo->strHost);
::PostMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) LPCTSTR (str));
::PostMessage(m_hWnd,WM_MSG_PINGSTOP,0,0);
::PostMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) "完成!");
continue;
}
saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));
}
else
{
saDest.sin_addr.s_addr =m_laddr;
}
saDest.sin_family = AF_INET;
saDest.sin_port = 0;
str.Format("Pinging %s [%s] with %d bytes of data:",
pThreadInfo->strHost,
inet_ntoa(saDest.sin_addr),
REQ_DATASIZE);
::PostMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) LPCTSTR (str));
if (WaitForSingleObject(pThreadInfo->m_hEventKillPing,0)
== WAIT_OBJECT_0)
break;
for (int nLoop = 0; nLoop < pThreadInfo->nRetries; nLoop++)
{
// Send ICMP echo request
if (WaitForSingleObject(pThreadInfo->m_hEventStopPing,0)
== WAIT_OBJECT_0)
break;
if (WaitForSingleObject(pThreadInfo->m_hEventKillPing,0)
== WAIT_OBJECT_0)
break;
SendEchoRequest(rawSocket, &saDest);
nRet = WaitForEchoReply(rawSocket);
if (!nRet)
{
str.Format("超时");
::PostMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) LPCTSTR (str));
}
else
{
// Receive reply
dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);
// Calculate elapsed time
dwElapsed = GetTickCount() - dwTimeSent;
str.Format("Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d",
nLoop+1,
inet_ntoa(saSrc.sin_addr),
REQ_DATASIZE,
dwElapsed,
cTTL);
::PostMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) LPCTSTR (str));

}
}

::PostMessage(m_hWnd,WM_MSG_PINGSTOP,0,0);
::PostMessage(m_hWnd,WM_MSG_STATUS, 0, (LPARAM) "完成!");
if (WaitForSingleObject(pThreadInfo->m_hEventKillPing,0)
== WAIT_OBJECT_0)
break;
}
nRet = closesocket(rawSocket);
ResetEvent(pThreadInfo->m_hEventKillPing);
SetEvent(pThreadInfo->m_hEvenPingtKilled);
return 1;
}