1 ошибка в Ping. C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by s_p_a_m, 25 Jun 2009.

  1. s_p_a_m

    s_p_a_m Elder - Старейшина

    Joined:
    8 Feb 2008
    Messages:
    100
    Likes Received:
    58
    Reputations:
    4
    вообщем создаю пустой консольное приложение и пытаюсь скомпилить этот код. Вылетает ошибка :

    error C2440: =: невозможно преобразовать 'HANDLE' в 'HINSTANCE'
    1> Для преобразования 'void*' к указателю на тип, не являющемуся 'void', требуется явное приведение

    в чем проблемма ?
    Code:
    #include <winsock.h>
    
    #define HOST_NAME "www.sources.ru"	// Любое доменное имя
    #define WINSOCK_VERSION 0x0101		// Версия винсока 1.1
    #define NO_FLAGS 0			// Флаги не указываем
    // В RFC 792 определены значения сообщений ICMP
    #define ICMP_ECHO 8			// An ICMP echo message
    #define ICMP_ECHOREPLY 0		// An ICMP echo reply message
    #define	ICMP_HEADERSIZE 8	
    #pragma comment(lib, "ws2_32.lib")
    struct ip 				// Структура заголовка IP
    {
    	BYTE ip_verlen;			// Version and header length
    	BYTE ip_tos;			// Type of service
    	WORD ip_len;			// Total packet length 
    	UINT ip_id;			// Datagram identification 
    	WORD ip_fragoff;		// Fragment offset 
    	BYTE ip_ttl;			// Time to live 
    	BYTE ip_proto;			// Protocol
    	UINT ip_chksum;			// Checksum 
    	IN_ADDR ip_src_addr;		// Source address 
    	IN_ADDR ip_dst_addr;		// Destination address 
    	BYTE ip_data[1];		// Variable length data area
    };
    			
    struct icmp				// Структура заголовка ICMP
    {
    	BYTE icmp_type;			// Type of message
    	BYTE icmp_code;			// Type "sub code" (zero for echos)
    	WORD icmp_cksum;		// 1's complement checksum
    	HINSTANCE icmp_id;		// Unique ID (the instance handle)
    	WORD icmp_seq;			// Tracks multiple pings
    	BYTE icmp_data[1];		// The start of optional data
    };
    
    char szPingBuffer[100];
    
    
    HINSTANCE hInstance;
    
    
    WORD InternetChksum(LPWORD lpwIcmpData, WORD wDataLength)
    {
    	long	lSum;		// Store the summation
    	WORD	wOddByte;	// Left over byte from the summation
    	WORD	wAnswer;	// The 1's complement checksum
    		
    	lSum = 0L;
    
    	while (wDataLength > 1)
    		{
    			lSum += *lpwIcmpData++;
    			wDataLength -= 2;
    		}
    
    	// Handle the odd byte if necessary and make sure the top half is zero
    	if (wDataLength == 1)
    		{
    			wOddByte = 0;
    			*((LPBYTE) &wOddByte) = *(LPBYTE)lpwIcmpData;	// One byte only
    			lSum += wOddByte;
    		}
    
    	// Add back the carry outs from the 16 bits to the low 16 bits
    	lSum = (lSum >> 16) + (lSum & 0xffff);	// Add high-16 to low-16
    	lSum += (lSum >> 16);			// Add carry
    	wAnswer = (WORD)~lSum;		// 1's complement, then truncate 
    					// to 16 bits
    	return(wAnswer);
    }
    
    
    BOOL DoPingOperation(HANDLE hInstance)
    {
    				// Локальные переменные
    int iPacketSize;		// размер ICMP-пакета 
    int iHostAddrLength;		// Длина адреса сетевого компьютера
    int iIPHeadLength;		// Длина заголовка IP-датаграммы
    int iReceivedBytes;		// Количество принятых байтов
    int iSentBytes;			// Количество посланных байтов
    int nProtocol;			// Номер протокола ICMP
    int iSocketError;		// Значение кода ошибки
    PDWORD pdwTimeStamp;		// Счетчик "тиков" при передаче
    DWORD dwReturnTime;		// Счетчик "тиков" при приеме
    DWORD dwRoundTrip;		// Счетчик "тиков" среднего времени пробега
    				// Структуры, описанные в WINSOCK.H
    SOCKADDR_IN	sockAddrLocal;	// Структуры адреса сокета
    SOCKADDR_IN	sockAddrHost;	// 
    SOCKET hSocket;			// Дескриптор сокета
    LPHOSTENT lpHostEntry;		// Структура данных с
    				// информацией о сетевом компьютере
    LPPROTOENT lpProtocolEntry;	// Структура данных с информацией о протоколе
    
    BYTE IcmpSendPacket[1024];	// Буфер для посылаемых данных
    BYTE IcmpRecvPacket[4096];	// Буфер для принимаемых данных 
    
    struct icmp *pIcmpHeader;	// Указатель на структуру ICMP
    struct ip *pIpHeader;		// Указатель на структуру-заголовок IP
    LPSTR lpszHostName;		// Указатель на удаленный сервер времени
    		
    lpszHostName = HOST_NAME;
    
    if ((lpHostEntry = gethostbyname(HOST_NAME)) == NULL) {
     wsprintf(szPingBuffer, "Could not get %s IP address.",	(LPSTR)lpszHostName);
     return(FALSE);
    }
        
    sockAddrLocal.sin_family = AF_INET;
    sockAddrLocal.sin_addr = *((LPIN_ADDR) *lpHostEntry->h_addr_list);
    
    // В случае простого сокета, мы должны указывать протокол
    if ((lpProtocolEntry = getprotobyname("icmp")) == NULL)
    	nProtocol = IPPROTO_ICMP;
    else
    	nProtocol = lpProtocolEntry->p_proto;
    		
    // Создаем простой сокет и указываем ICMP в качестве протокола
    if ((hSocket = socket(PF_INET, SOCK_RAW, nProtocol)) == INVALID_SOCKET)
    {
     wsprintf(szPingBuffer, "Could not create a RAW socket.");
     return(FALSE);
    }
    
    pIcmpHeader = (struct icmp *) IcmpSendPacket;	// Point at the data area
    pIcmpHeader->icmp_type = ICMP_ECHO;		// then fill in the data.
    pIcmpHeader->icmp_code = 0;			// Use the Sockman instance 
    pIcmpHeader->icmp_id = hInstance;		// handle as a unique ID.
    pIcmpHeader->icmp_seq = 0;			// It's important to reset
    pIcmpHeader->icmp_cksum = 0;			// the checksum to zero.
    		
    //Значение счетчика "тиков" располагается в необязательной области данных
    pdwTimeStamp = (PDWORD)&IcmpSendPacket[ICMP_HEADERSIZE];
    *pdwTimeStamp = GetTickCount();
    iPacketSize = ICMP_HEADERSIZE + sizeof(DWORD);
    pIcmpHeader->icmp_cksum = InternetChksum((LPWORD)pIcmpHeader, iPacketSize);
        
    if (pIcmpHeader->icmp_cksum !=0 )
    {    
     iSentBytes = sendto(hSocket, (LPSTR) IcmpSendPacket, iPacketSize, 
    	NO_FLAGS, (LPSOCKADDR) &sockAddrLocal, sizeof(sockAddrLocal));
     if (iSentBytes == SOCKET_ERROR) {
    	closesocket(hSocket);
    	wsprintf(szPingBuffer,
    		"The sendto() function returned a socket error.");
    	return(FALSE);
     }
    		
     if (iSentBytes != iPacketSize)	{
    	closesocket(hSocket);
    	wsprintf(szPingBuffer,
    		"Wrong number of bytes sent: %d", iSentBytes);
    	return(FALSE);
     }
    		
     iHostAddrLength = sizeof(sockAddrHost);
    		
     iReceivedBytes = recvfrom(hSocket, (LPSTR) IcmpRecvPacket, 
    	sizeof(IcmpRecvPacket), NO_FLAGS, (LPSOCKADDR) &sockAddrHost,
    						&iHostAddrLength);
    }
    else {
     closesocket(hSocket);
     wsprintf(szPingBuffer, "Checksum computation error! Result was zero!");
     return(FALSE);
    }
        
    closesocket(hSocket);
    		
    if (iReceivedBytes == SOCKET_ERROR) { 
     iSocketError = WSAGetLastError();
     if (iSocketError == 10004) {
    	wsprintf(szPingBuffer,
    	"Ping operation for %s was cancelled.", 
    			(LPSTR)lpszHostName);
    	dwRoundTrip = 0;
    	return(TRUE);
     }
     else {
    	wsprintf(szPingBuffer,
    		"Socket Error from recvfrom(): %d", iSocketError);
    	return(FALSE);
     }
    }
    
    dwReturnTime = GetTickCount();
    dwRoundTrip = dwReturnTime - *pdwTimeStamp;
    
    // Указываем на IP-заголовок принятого пакета
    pIpHeader = (struct ip *)IcmpRecvPacket;
    
    // Извлекаем биты 4-7 и преобразуем количество З2-битных слов в количество байтов
    iIPHeadLength = (pIpHeader->ip_verlen >> 4) << 2;
    
    // Проверяем длину, чтобы удостовериться, что ICMP-заголовок принят
    if (iReceivedBytes < iIPHeadLength + ICMP_HEADERSIZE) {
    	wsprintf(szPingBuffer, "Received packet was too short.");
    	return(FALSE);
    }
    
    // Указываем на ICMP-сообщение, следующее сразу за IP-заголовком
    pIcmpHeader = (struct icmp *) (IcmpRecvPacket + iIPHeadLength);
    
    // Проверяем, что мы приняли именно "эхо"-ответ
    if (pIcmpHeader->icmp_type != ICMP_ECHOREPLY) {
    	wsprintf(szPingBuffer,
    		"Received packet was not an echo reply to your ping.");
    	return(FALSE);
    }
    
    // Проверяем, принадлежит ли этот пакет нашей программе
    if (pIcmpHeader->icmp_id != (HINSTANCE)hInstance) {
    	wsprintf(szPingBuffer,
    		"Received packet was not sent by this program.");
    	return(FALSE);
    }
    
    // Да, этот пакет был послан нашей программой. Обратите
    // внимание на IP-адрес и имя удаленного компьютера,
    // пославшего "эхо"-ответ
    lstrcpy(lpszHostName, (LPSTR)lpHostEntry->h_name);
    wsprintf(szPingBuffer,
    	"Round-trip travel time to %s [%s] was %d milliseconds.",
    	(LPSTR)lpszHostName, (LPSTR)inet_ntoa(sockAddrHost.sin_addr), 
    				dwRoundTrip);
    		
    return(TRUE); 
    }
    
    
    void main ()
    {
    	WSADATA wsaData;
    
    	WSAStartup(WINSOCK_VERSION, &wsaData);
    		
    	DoPingOperation(hInstance);
    	MessageBox(NULL, szPingBuffer, "www.sources.ru", MB_OK|MB_ICONSTOP);
    
    	WSACleanup();
    }	 
     
    1 person likes this.
  2. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    pIcmpHeader->icmp_id = (HINSTANCE)hInstance; // handle as a unique ID.
     
  3. s_p_a_m

    s_p_a_m Elder - Старейшина

    Joined:
    8 Feb 2008
    Messages:
    100
    Likes Received:
    58
    Reputations:
    4
    и ?