begin process at 2012 05 28 14:13:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Réseau & Internet

 > 

bonjour j'ai un problème dans un code ping implémenter avec le c++, que je n'arrive pas à résoudre. s'il vous plait aider moi. Merci d'avance.


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

bonjour j'ai un problème dans un code ping implémenter avec le c++, que je n'arrive pas à résoudre. s'il vous plait aider moi. Merci d'avance.

jeudi 5 mai 2011 à 17:53:00 | bonjour j'ai un problème dans un code ping implémenter avec le c++, que je n'arrive pas à résoudre. s'il vous plait aider moi. Merci d'avance.

talelham

bonjour
j'ai un problème dans un code ping implémenter avec le c++, que je n'arrive pas à résoudre.

s'il vous plait aider moi.
Merci d'avance.
voilà le code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <linux/ip.h>
#include <linux/icmp.h>
#include <string.h>
#include <unistd.h>

unsigned short in_cksum(unsigned short *, int);
int main()
{
int addrlen;
int k;

char d_addr[17];
struct iphdr *ip;
struct icmphdr *icmp;
struct icmphdr *icmp_reply;
struct iphdr *ipreply;
char *packet;
char *buffer;
int raw;
char *n;
struct sockaddr_in serv;
int optval=1;
int sent;

printf("Enter the destination address : ");
fgets(d_addr,17,stdin);

n= strchr(d_addr, '\n'); /* search for newline character */

if ( n != NULL )

{

*n = '\0'; /* overwrite trailing newline */

}


// Allocate space

packet=malloc(sizeof(struct iphdr)+sizeof(struct icmphdr));
buffer=malloc(sizeof(struct iphdr)+sizeof(struct icmphdr));


//setting up the ip header

ip=(struct iphdr *)packet;

//Setting the values for the ip header

ip->ihl=5; //header length
ip->version=4; //version
ip->tos=0; //type of service
ip->tot_len=htons(sizeof(struct iphdr)+sizeof(struct icmphdr)); //toatal length
ip->id=htons(random()); //Assign id as a random number
ip->ttl=255; //time to live;
ip->protocol=IPPROTO_ICMP;//ICMP header follow next to the ip header
ip->check=0; //Assign checksum as zero for now
ip->saddr= INADDR_ANY;
ip->daddr=inet_addr(d_addr);

//Creating a raw socket

if((raw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))==-1)
{
perror("Something wrong with socket call :");
}

//setting the iphdrincl option

setsockopt(raw, IPPROTO_IP, IP_HDRINCL, &optval, sizeof(int));

//creating the icmp header
icmp=(struct icmphdr *)(packet+sizeof(struct iphdr));

icmp->type=ICMP_ECHO;
icmp->code = 0;
icmp->un.echo.id = 0;
icmp->un.echo.sequence = 0;
icmp->checksum = 0;
icmp-> checksum = in_cksum((unsigned short *)icmp, sizeof(struct icmphdr));

ip->check = in_cksum((unsigned short *)ip, sizeof(struct iphdr));

serv.sin_family=AF_INET;
serv.sin_addr.s_addr=ip->daddr;

sent=sendto(raw,packet,ntohs(ip->tot_len),0,(struct sockaddr *)&serv,sizeof(struct sockaddr));


/*
*listen for response
*/
addrlen = sizeof(serv);
if ((k=recvfrom(raw, buffer, (sizeof(struct iphdr) + sizeof(struct icmphdr)), 0, (struct sockaddr *)&serv, &addrlen)) == -1)
{
perror("recv");
}


ipreply=(struct iphdr *)buffer;
icmp_reply=(struct icmphdr *)(buffer + sizeof (struct iphdr));
struct in_addr inad;



printf("Received %d byte reply from: %s\n", k, inet_ntoa (serv.sin_addr));
inad.s_addr = ipreply->saddr;
printf("Src IP: %s\n", inet_ntoa (inad));
inad.s_addr = ipreply->daddr;
printf("Dst IP: %s\n", inet_ntoa (inad));
printf("ID: %d\n", ntohs(ipreply->id));
printf("TTL: %d\n", ipreply->ttl);
printf("ICMP type: %d\n",icmp_reply->type);
printf("ICMP code: %d\n",icmp_reply->code);
printf("ICMP echo ID: %d\n",icmp_reply->un.echo.id);
printf("ICMP echo seq: %d\n",icmp_reply->un.echo.sequence);
close(raw);
free(packet);
return 0;



}
/*
* in_cksum --
* Checksum routine for Internet Protocol
* family headers (C Version)
*/

unsigned short in_cksum(unsigned short *addr, int len)
{
register int sum = 0;
u_short answer = 0;
register u_short *w = addr;
register int nleft = len;
/*
* Our algorithm is simple, using a 32 bit accumulator (sum), we add
* sequential 16 bit words to it, and at the end, fold back all the
* carry bits from the top 16 bits into the lower 16 bits.
*/
while (nleft > 1)
{
sum += *w++;
nleft -= 2;
}
/* mop up an odd byte, if necessary */
if (nleft == 1)
{
*(u_char *) (&answer) = *(u_char *) w;
sum += answer;
}
/* add back carry outs from top 16 bits to low 16 bits */
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
sum += (sum >> 16); /* add carry */
answer = ~sum; /* truncate to 16 bits */
return (answer);
}


Cette discussion est classée dans : icmp, ip, sizeof, struct, addr


Répondre à ce message

Sujets en rapport avec ce message

winsock raw socket ping icmp recv [ par 4aBestWord ] bonjour,j'ai repris un code source en c pour faire un un ping icmp en utilisant les raw sockets sous windows (XP). L'envoie du ping fontionne bien par Sockets [ par Suxyt ] Bonjour à tous, Actuellement, je travaille sur un projet qui consiste d'envoyer et de recevoir des données en construisant l'en-tête soi-même. Pour e PING sous protocole TCP [ par ivdz ] Bonjour, J'ai besoin de votre aide. Je travaille sous C++ Builder 6. Je dois envoyer un message ICMP de Type Echo Request puis récupérer le message Raw socket TCP/IP sous Windwos XP [ par MaximeH ] Bonjour à tous, J'aimerais savoir pourquoi ce code ne marche pas (il n'es pas de moi, c'est sensé être un exemple ...) : ###code // SheepTCP->SYN Ha passage de structure a un thread [ par anthonycosson ] bijour tout le monde g un pb qui me blocje voudrai savoir comment passer une structure a AfxBeginThread et récupéré les donner précédement enregistrer récuparation IP [ par cyril4900 ] Bonjour, Voila je veux un code qui me récupère l'addresse IP de ma machine hote qui fonctionne sur Winows et LINUX. Et c'est la le problème car j'ai Envoi , reception et "analyse" d'un packet TCP [ par firemax ] Bonjour Avec un pote nous avons commencer un scanner de port pour en apprendre un peu plus sur la prog reseau en C . Mais une fois que nous avons eu envoi de paquet ip [ par sendouda ] Bonjour;j'ai écrit un programme qui permet d'envoyer des paquets ip à une destination.mais quand j'ai voulu le sniffer j'ai pas pu le capter.J'ai beso urgent:envoi paquet [ par sendouda ] Bonjour;j'ai écrit un programme qui permet d'envoyer des paquets ip à une destination.mais quand j'ai voulu le sniffer j'ai pas pu le capter.J'ai beso socket RAW ICMP - fonctionnement et implémentation... [ par smirnoff69ice ] Salut, Je suis sur un projet et je dois simuler l'envoi de paquets ICMP sur le réseau. J'ai déjà fait un petit programme de test (repris en partie dep


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,136 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales