Ir ao conteúdo

Posts recomendados

Postado

boa noite/bom-dia pessoal, não tenho conhecimento para fazer essa conversão ou deixar compatível, se alguém puder por favor fazer isso pra mim ficarei agradecido de coração.

 

meu problema é o código abaixo que está usando biblioteca do windows WINSOCK2.H para fazer um ping no ip fornecido por um comando ping("ip")  e retornar uma msg igual ao ping do windows, gostaria se possível que o mesmo fosse utilizado em linux (centos) mantendo a mesma funcionalidade.

 

ping.c

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include <WINSOCK2.H>
#define DEF_BUF_SIZE 1024  
#define IP_HEADER_SIZE 20  
#define ICMP_HEADER_SIZE 12    
typedef struct _ICMP_HEADER  
{  	
	BYTE bType;
	BYTE bCode;
	USHORT nCheckSum;
	USHORT nId;
	USHORT nSequence;
	UINT nTimeStamp;
}ICMP_HEADER, *PICMP_HEADER;    
USHORT GetCheckSum(LPBYTE lpBuff, DWORD dwSize)
{
	DWORD dwCheckSum = 0;
	USHORT* lpWord = (USHORT*)lpBuff;  
	while(dwSize > 1)  	
	{  		
		dwCheckSum += *lpWord++;
		dwSize -= 2;
	}  	
	if(dwSize ==1)  	
		dwCheckSum += *((LPBYTE)lpBuff);
	dwCheckSum = (dwCheckSum >> 16) + (dwCheckSum & 0XFFFF);
	return (USHORT)(~dwCheckSum);  
}    
BOOL Ping(char* lpDestIP, int *nRet_, int *nTime_)
{
	int nTime = 0;
	int ret = 0;
	char ICMPPack[ICMP_HEADER_SIZE] = {0};
	char szRcvBuff[DEF_BUF_SIZE] = {0};
	int i = 0;
	int nRet = 0;
	int nLen = 0;
	int nError = 0;
	SOCKET s;
	PICMP_HEADER pRcvHeader;
	SOCKADDR_IN SourceSockAddr;
	SOCKADDR_IN DestSockAddr;
	PICMP_HEADER pICMPHeader;
	DestSockAddr.sin_family = AF_INET;
	DestSockAddr.sin_addr.S_un.S_addr = inet_addr(lpDestIP);
	DestSockAddr.sin_port = htons(0);
	pICMPHeader = (PICMP_HEADER)ICMPPack;  
	pICMPHeader->bType = 8;
	pICMPHeader->bCode = 0;
	pICMPHeader->nId = (USHORT)GetCurrentProcessId();
	pICMPHeader->nCheckSum = 0;
	pICMPHeader->nTimeStamp = 0;
	s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
	nTime = 1000;
	ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTime, sizeof(nTime));
	for(i=0; i <1; i++)  	
	{  		
		pICMPHeader->nCheckSum = 0;
		pICMPHeader->nSequence = i;
		pICMPHeader->nTimeStamp = GetTickCount();
		pICMPHeader->nCheckSum = GetCheckSum((LPBYTE)(ICMPPack), ICMP_HEADER_SIZE);
		nRet = sendto(s, ICMPPack, ICMP_HEADER_SIZE, 0, (SOCKADDR*)&DestSockAddr, sizeof(DestSockAddr)); 
		if(nRet == SOCKET_ERROR)
		{ 
			return FALSE;
		}  		
		nLen = sizeof(SOCKADDR_IN);
		if(nRet == SOCKET_ERROR)
		{
			return FALSE;
		}
		nRet = recvfrom(s, szRcvBuff,DEF_BUF_SIZE,0,(SOCKADDR*)&SourceSockAddr,&nLen);
		if(nRet == SOCKET_ERROR)
		{
			return FALSE;
		}
		pRcvHeader = (PICMP_HEADER)(szRcvBuff + IP_HEADER_SIZE);
		nTime = GetTickCount() - pRcvHeader->nTimeStamp;
		//printf("Return Message: %s bytes=%d time=%dms\n", inet_ntoa(SourceSockAddr.sin_addr), nRet, nTime);
		*nRet_ = nRet;
		*nTime_ = nTime;
	}
	return TRUE;
}

a outra estrutura:

#include "ping.c"
BUILDIN_FUNC(ping) {
	//
	const char *name;
	char _cmd[500];
	int nRet=0, nTime=0;
	//
	//
	name = script_getstr(st,2);
	Ping((char *)name, &nRet, &nTime);
	if( nRet <= 0 || nTime < 0 )
		sprintf(_cmd,"Return Message: %s fail to connect", (char *)name);
	else
		sprintf(_cmd,"Return Message: %s bytes=%d time=%dms\n", (char *)name, nRet, nTime);
	//
	script_pushstrcopy(st, _cmd);
	return 0;
}
BUILDIN_DEF(ping,"s")

 

Ou se for muito trabalho poderiam me apontar guias ou uma forma da qual eu consiga fazer o que preciso, tenho noções de programação mas não diretamente com C ou C++.

Desde já muito obrigado, fiz algumas buscas mas não achei nada que possa me ajudar a fazer essa conversão ou até mesmo redigir o código para funcionar em linux.

 

 

 

 

 

 

 

  • Curtir 1
Postado

Há tempos que não escrevo esas coisas, mas é quase o mesmo em Windows e UNIX/Linux eu acho. Ou era ao menos :) 

 

Os headers estão em <sys/socket.h> e <netinet/in.h> eu acho.

 

O resumo do que você quer é mandar um pacote tipo ECHO.

 

Não foi você que escreveu esse programa, certo?

 

Aqui em seu programa

 

	pICMPHeader->bType = 8;
	pICMPHeader->bCode = 0;

 

é onde define o que vai fazer. Basicamente você cria uma estrutura socket e preenche definindo para o pacote o protocolo ICM, o tipo 8 --- ECHO --- e deixa o codigo como 0. Coloca o endereço do destinatário e envia. Se o destino estiver configurado para responder a esses pacotes ele devolve igualzinho, um... eco. 

 

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!