begin process at 2012 05 30 17:31:49
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Réseau & Internet

 > 

Sockets


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

Sockets

jeudi 25 février 2010 à 15:05:17 | Sockets

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 effectuer ceci, j'ai effectué des sockets RAW en udp.

Donc mon programme de sockets, j'ai défini de cette manière:

**********Fonction Calcul Checksum**************

**********Programme Principal**********
Déclaration de mes variables + celui du buffer

Ci-dessous, je place au niveau de mon buffer ou se trouve chaque champ c'est-à-dire IP|UDP|Data
struct ip *ip = (struct ip *) buffer;
struct udphdr *udp = (struct udphdr *) (buffer + sizeof(struct ip));
data=(char *)(buffer+sizeof(struct ip)+sizeof(struct udphdr));
strcpy(data, "abd");

Création de la socket
s = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
Ensuite je mets les memset pour la source et la destination
Attachement de la socket par le bind

Assignation des valeurs pour ip et udp

Envoi de la trame par un sendto

******************Fin du programme****************


Lorsque je fais mon programme de cette manière cela fonctionne à merveille, j'envoi bien le mot abd et il est bien reçu sur mon serveur. J'ai même pu d'ailleurs vérifier avec tcpdump voire même wireshark si la donnée allait bien du client au serveur ce qui est le cas.

Mon problème actuel c'est que je souhaite envoyer plusieurs valeurs qui sont retournées par des fonctions spécifiques qui me retournent un entier et que je veux intégrer à ma donnée.
Pour faire ceci, j'ai créer une structure ou se trouve 3 variables:

struct data{
int a;
int b;
int c;
};

Ensuite à la place de la partie data=(char *)(buffer+sizeof(struct ip)+sizeof(struct udphdr)) et strcpy(data,"abd"), je les ai remplacé par:
struct data * data;
data=(struct data *)(buffer+sizeof(struct ip)+sizeof(struct udphdr));
data->a=0x12;
data->b=0x23;
data->c=0x34;

La valeur de ses variables sont 0x12 car si je mettais juste 12 alors dans l'en-tête, on ne voit pas cette valeur d'ou la raison de l'héxa ici.

Lorsque j'envoi, mon serveur ne reçoit rien alors qu'il recevait à merveille auparavant.

Auriez vous une suggestion sur l'erreur que j'ai commise ?

Merci de me répondre.
A bientôt.



samedi 27 février 2010 à 06:35:44 | Re : Sockets

katsankat

Membre Club
Salut tu ne peux pas envoyer d'entier tel quel -enfin si, mais attention à deux choses :
1) l'indien, quel est le bit significatif? Ca dépend de l'architecture du processeur, voir hton().
2) De plus, le compilateur pourrait ordonner la structure différemment en mémoire ainsi celui qui reçoit ne décoderait pas dans le même ordre (quoi que dans ton cas trois int ne changeront rien, par contre un char* et deux int pourraient se voir intervertis par le compilateur: les int d'abord et le char* ensuite).

Sinon plus simple il faut sérialiser les données de la structure: passer la structure dans un buffer en regroupant chaque membre de la structure en un seul buffer avec sprintf() côté envoyeur, et invoquer scanf() chez celui qui reçoit. Une succession d'atoi()/itoa() le ferait aussi.
samedi 27 février 2010 à 06:39:31 | Re : Sockets

katsankat

Membre Club
J'avais oublié, quand tu fais data->a=0x12; ça envoie le caractère ASCII numéro 18 (12 en hexa), qui n'est pas imprimable, alors que 'a' oui (0x61)
http://www.table-ascii.com/
samedi 27 février 2010 à 10:58:52 | Re : Sockets

Suxyt

Bonjour et merci de ta réponse.

Au sujet de la structure c'était juste un exemple, j'assigne une valeur quelconque à ma variable 'a'. Le code ascii ne rentre pas en compte la dedans.

Sinon au sujet du sprintf et du sscanf, serait-il possible que tu me montres un exemple qui me permette de comprendre correctement car je reste tout de même novice dans ce domaine. Aussi pour les itoa() et atoi() s'il te plait.

Merci de répondre.
A bientôt.



Cette discussion est classée dans : buffer, data, ip, sizeof, struct


Répondre à ce message

Sujets en rapport avec ce message

Horoscope (recuperer sur site) [ par Tidam ] Voila j'ai un probleme, avec mon code j'envoi une requette HTTP au serveur et il me renvoi exactement ce que je lui ai envoyé ... quelqu'un pourrait m 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 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 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. [ par 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à Erreur de segmentation sniffer linux [ par gauthzilla ] bonjour, j'ai récuprer les sources d'un sniffer sur http://www.estvideo.com/dew/index/page/sniffer lorsque je compile sous linux, tout va bien. Mais 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 client serveur echange de donne [ par bapdur ] voici la version dun client et dun serveur que je fais pour un jeu mais les donnes son envoyer en continu jaimerais aire en sorte que si je tape un ca déclaration et utilisation d'un buffer (pile TCP/IP) [ par aefmaaradji ] Bonjour, je voudrais savoir comment utiliser et declarer un buffer dans le visual c++/cli car j'ai fait une capture TCP/IP (sniffing) es RESEAU PAR SOCKET EN C [ par aziatedu13 ] bonjour,je veux faire un truk extremement simple pour certain, mais assez très difficile pour moi..voila je souhaiterai pouvoir afficher dans une cons


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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 : 1,732 sec (3)

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