 |
|
|
 |
|
|
 |
|
|
 |
|
|
 |
|
|
 |
|
 |
Hi!
I making this program to an console app. Because of that I need to change the code. In debuging mode, after calling rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); The socket is SOCKET == ERROR and goes into Error mode instead of going to the OnPing as it does in the winapp.
Why does the compiler go to OnTimer after that the socket funktion is called?
Look here Debug: .... .... -> rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); -> void CWinPingDlg::OnTimer(UINT nIDEvent) ... ...
I am nott familiar with sockets!
Any suggestions?
GOgo
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
 |
when my firewall is open this ping program cannot ping to the web server,please tell me how to change this program to ping to the web server when the firewall is open.
I appreciate your help.
|
| Sign In·View Thread·PermaLink | 2.00/5 (1 vote) |
|
|
|
 |
|
 |
Hey there,
Hope you still visit this article, as am having problems with ping application of mine which has similar logic as your app and some how windows firewall blocks ICMP packets, was wondering if there is a way around.
thanks Rahul
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
 |
|
|
 |
|
 |
WSA Error 10022 comes out when run in windows XP SP2
may i know what is the cause and how to solve it
thanks
|
| Sign In·View Thread·PermaLink | 2.00/5 (1 vote) |
|
|
|
 |
|
 |
hi! are the sources files of the ping are updated without the bug??? please let me know!!! and ansere!! cu surf.
|
| Sign In·View Thread·PermaLink | 2.00/5 (1 vote) |
|
|
|
 |
|
 |
Hello,
I have a short question. I open this ping-dialog as a non-modal dialog and the ping request is send (for example 10 retries). I can close the dialog, but I can't do anything in the parent dialog, because the ping is also running in background. After a few seconds, when the ping is over all is ok. How can I stop the ping-thread when the non-modal dialog should be close??? 
Thanxx Jessica
|
| Sign In·View Thread·PermaLink | 2.00/5 (1 vote) |
|
|
|
 |
|
 |
I tried to do a broadcast ping in my application but it gives me a runtime error. By the way, I am working in Windows 2000 server and use winSock2.h to deal with sockets. I feel that you will give me part of your time to answer me. I will ask you another favore, if you know any good E_books to learn the network programming.
thank you. . . .
|
| Sign In·View Thread·PermaLink | 1.33/5 (3 votes) |
|
|
|
 |
|
 |
HI when I try to run WinPing under Windows XP envirment I get SOCKET_ERROR in the following code: rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
something wrong with the system or any ideas? How can I solve the problem? thanks
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
 |
you must initlaize socket before creating socket if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FALSE; }
|
| Sign In·View Thread·PermaLink | 1.50/5 (2 votes) |
|
|
|
 |
|
|
 |
|
 |
Hi, please see my message at:
http://www.codeproject.com/internet/winping.asp?df=100&forumid=905&select=445021#xx445021xx
the next to your message.
Regards, Hanney
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
 |
:( Scene - 1: Use the executable to ping a dead host (ie. 129.133.156.100), 50 retries, start to ping, it should always receive a timeout message.Well, start a command window now, use windows ping to ping an active host (ie. 127.0.0.1), see what happend in WinPing window -- it got a reply, why?
Scene - 2: Use the executable to ping a dead host (ie. 129.133.156.100), 50 retries, start to ping, it should always receive a timeout message.Well, start another WinPing window now and ping an active host (ie. 127.0.0.1), see what happend in WinPing window -- it got a reply, why?
Regards, Hanney Wang
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
 |
WinPing have this bug because it don't test if a icmp packet received is an answer for it.
In other words, Windows give to WinPing all icmp packets are received(included answer pings for other winping instances), and in the RecvEchoReply functions, you must verify what packets are yours. One method is used to solve this, is save in the id field of icmp header the process id and compare the value of this in all icmp packets received.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
 |
|
 |
Thank you! But so sorry for the late reply! I also realized this problem from Microsoft code sample, so, I had found an other way to solve this problem - using MS ICMP APIs. Here is my code:
#define PING_WINSOCK_VERSION 0x0101 #define PING_REQ_DATASIZE 64 // Echo Request Data size #define PING_ERROR_SUCCESS 0 #define PING_ERROR_TIMEOUT 1 #define PING_ERROR_SOCKET 2
typedef struct tagIPINFO { unsigned char Ttl; // Time To Live unsigned char Tos; // Type Of Service unsigned char IPFlags; // IP flags unsigned char OptSize; // Size of options data unsigned char far * Options; // Options data buffer }IPINFO, *PIPINFO;
typedef struct tagICMPECHO { unsigned long Source; // Source address unsigned long Status; // IP status unsigned long RTTime; // Round trip time in milliseconds unsigned short DataSize; // Reply data size unsigned short Reserved; // Unknown void far * pData; // Reply data buffer IPINFO ipInfo; // Reply options }ICMPECHO, * PICMPECHO;
// Ping results typedef struct tagPINGINFO { char cHostName[32]; char cIpAddress[20]; char cErrorMessage[256]; unsigned int blTimouted; short nSendBytes; short nReplyBytes; unsigned long nReplyTime; unsigned char nReplyTTL; }PINGINFO, *PPINGINFO;
__declspec(dllexport) unsigned int _cdecl PingHost( void far* lpPingInfo ) { PPINGINFO pPingInfo = (PPINGINFO)lpPingInfo; if(pPingInfo == NULL)return( FALSE );
HANDLE (WINAPI *pIcmpCreateFile)(VOID); BOOL (WINAPI *pIcmpCloseHandle)(HANDLE); DWORD (WINAPI *pIcmpSendEcho) (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD); HANDLE hndlIcmp; // LoadLibrary() handle to ICMP.DLL WSADATA wsaData; // WSADATA struct in_addr iaDest; // Internet address structure LPHOSTENT pHost; // Pointer to host entry structure DWORD *dwAddress; // IP Address HANDLE hndlFile; // Handle for IcmpCreateFile()
// Dynamically load the ICMP.DLL hndlIcmp = LoadLibrary("ICMP.DLL"); if (hndlIcmp == NULL) { sprintf(pPingInfo->cErrorMessage, "Could not load ICMP.DLL!"); return( PING_ERROR_SOCKET ); } // Retrieve ICMP function pointers pIcmpCreateFile = (HANDLE (WINAPI *)(void)) GetProcAddress((HMODULE)hndlIcmp,"IcmpCreateFile"); pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE)) GetProcAddress((HMODULE)hndlIcmp,"IcmpCloseHandle"); pIcmpSendEcho = (DWORD (WINAPI *) (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD)) GetProcAddress((HMODULE)hndlIcmp,"IcmpSendEcho"); // Check all the function pointers if (pIcmpCreateFile == NULL || pIcmpCloseHandle == NULL || pIcmpSendEcho == NULL) { sprintf(pPingInfo->cErrorMessage, "Error loading ICMP.DLL functions!"); FreeLibrary((HMODULE)hndlIcmp); return( PING_ERROR_SOCKET ); }
// Init WinSock if (WSAStartup(PING_WINSOCK_VERSION, &wsaData)) { sprintf(pPingInfo->cErrorMessage, "Winsock could not be initialized!"); WSACleanup(); return( PING_ERROR_SOCKET ); } // Check WinSock version if (0x0101 != wsaData.wVersion) { sprintf(pPingInfo->cErrorMessage, "No WinSock version 1.1 support found!"); WSACleanup(); FreeLibrary((HMODULE)hndlIcmp); return( PING_ERROR_SOCKET ); } // Resovling the Host iaDest.s_addr = inet_addr(pPingInfo->cHostName);
if (iaDest.s_addr == INADDR_NONE) pHost = gethostbyname(pPingInfo->cHostName); else pHost = gethostbyaddr((const char *)&iaDest, sizeof(struct in_addr), AF_INET); if (pHost == NULL) { sprintf(pPingInfo->cErrorMessage, "Unable resolve host %s!", pPingInfo->cHostName); FreeLibrary((HMODULE)hndlIcmp); WSACleanup(); return( PING_ERROR_SOCKET ); }
// Copy the IP address dwAddress = (DWORD *)(*pHost->h_addr_list);
// Get an ICMP echo request handle hndlFile = pIcmpCreateFile();
if(hndlFile < 0) { sprintf(pPingInfo->cErrorMessage, "Unable get ICMP handle!"); FreeLibrary((HMODULE)hndlIcmp); WSACleanup(); return( PING_ERROR_SOCKET ); }
// Start to Ping unsigned char request_data[PING_REQ_DATASIZE]; unsigned char reBuff[sizeof(ICMPECHO)+200]; IPINFO ipInfo; // IP Options structure ICMPECHO *icmpEcho = NULL; // ICMP Echo reply buffer
memset(reBuff, 0, sizeof(ICMPECHO)+200); memset(request_data, 0, sizeof(request_data)); memset(&ipInfo, 0, sizeof(ipInfo)); ipInfo.Ttl = 255; ipInfo.Options = request_data;
pIcmpSendEcho( hndlFile, // Handle from IcmpCreateFile() *dwAddress, // Destination IP address request_data, // Pointer to buffer to send sizeof(request_data), // Size of buffer in bytes &ipInfo, // Request options reBuff, // Reply buffer sizeof(reBuff), 1000); // Time to wait in milliseconds
icmpEcho = (ICMPECHO *) reBuff; // Get the results iaDest.s_addr = icmpEcho->Source; sprintf(pPingInfo->cIpAddress, "%s", inet_ntoa(iaDest)); if (icmpEcho->Status) { sprintf(pPingInfo->cErrorMessage, "%d - Request timed out.", icmpEcho->Status); pPingInfo->blTimouted = TRUE; pPingInfo->nReplyBytes = pPingInfo->nReplyTTL = 0; pPingInfo->nReplyTime = 0; } else { sprintf(pPingInfo->cErrorMessage, "No Error!"); pPingInfo->blTimouted = FALSE; pPingInfo->nReplyBytes = icmpEcho->DataSize; pPingInfo->nReplyTTL = icmpEcho->ipInfo.Ttl; pPingInfo->nReplyTime = icmpEcho->RTTime; }
// Close the echo request file handle pIcmpCloseHandle(hndlFile); FreeLibrary((HMODULE)hndlIcmp); WSACleanup();
return pPingInfo->blTimouted ? PING_ERROR_TIMEOUT : PING_ERROR_SUCCESS ; }
Regards, Hanney
|
| Sign In·View Thread·PermaLink | 3.50/5 (2 votes) |
|
|
|
 |
|
 |
Hi,Sonu,
I'm trying to find your message in the forums, but I failed. So I reply your message here, sorry for the late reply.
To answer your question, one point I need to clarify is the codes I post can run 2 instances in one App, but for the code of Norm Almond, I encountered an error while 1 of 2 host is NOT active, the code will drop into a dead loop in "recvfrom" (RecvEchoReply).
I made a small changes for WinPing so that it can detect which packet it should response, the key is "ID" of ICMPHDR structure, while you send ICMP request, this member data should be filled in your own process(or Thread) ID.
1) in CPing::SendEchoRequest, replace the "nID++" with your own thread ID echoReq.icmpHdr.ID = (USHORT)GetCurrentThreadId();
2) in "DWORD CPing::RecvEchoReply" detect your own packet: for(; { // Receive the echo reply nRet = recvfrom(s, // socket (LPSTR)&echoReply, // buffer sizeof(ECHOREPLY), // size of buffer 0, // flags (LPSOCKADDR)lpsaFrom, // From address &nAddrLen); // pointer to address len
if( echoReply.echoRequest.icmpHdr.ID == (USHORT)GetCurrentThreadId() ) break; // If NOT equal, it's someone else packet }
Hope it can answer your question, any question, please send me email.
Best Regards, Hanney Wang
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
 |
thanks for the code. It worked very well. I have send you an another email. Please let me know about that.
thanks
da sonu 
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
 |
It seems not to be a good idea to put recvfrom in an infinite loop.
My solution:
(before calling WaitForEchoReply in CPing::Ping)
m_dwStart = GetTickCount();
m_dwStart is a private member of CPing.
(in the for(; loop)
if (GetTickCount() - m_dwStart > 1000) {     // do sth. to handle the timeout scene     break; }
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |