CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Pointeurs/références étranges...

Chaos_Clad
Chaos_Clad
Niveau 10
15 novembre 2007 à 22:30:18

Bonjour à tous, je lisais un tutoriel sur les sockets afin de construire un petit logiciel de messagerie instantannée basique entre deux PCs, et n´ayant jamais touché à la programmation réseau, il a bien fallu que je commence quelque part.
Premièrement, apparemment les documentations sur l´utilisation des sockets ne foisonnent pas, auriez-vous quelques liens sympas (si possibles en français mais l´anglais ne me dérange pas) ?
Deuxièmement, pouvez-vous me dire ce que signifie ça :
(SOCKADDR *)&sin; ?
Pas sa fonction globale dans l´utilisation des sockets, mais je n´ai jamais vu cette structure, &sin représente l´adresse de sin non ? Alors qu´est ce que vient foutre ce (SOCKADDR *) devant ?

Merci à vous ^^

dnob700
dnob700
Niveau 10
15 novembre 2007 à 22:55:14

c´est un cast. Je ne sais pas comment est déclaré sin, mais globalement, l´idée est de dire au compilo que quoi qu´il croit que soit sin, il faut considérer que &sin est l´adresse d´une variable de type SOCKADDR. En réalité c´est le cas, mais je crois que sin est plus spécifique que juste sockaddr, mais compatible.

Un bon tuto, est celui que j´ai indiqué il y a quelques jours :
http://beej.us/guide/bgnet/
(sur la page, vers le bas, il y a un lien vers une traduction en français, mais elle est de moins bonne qualité). Pour les socket en C, c´est l´une des références et c´est très complet.

Chaos_Clad
Chaos_Clad
Niveau 10
15 novembre 2007 à 23:00:19

Merci pour le lien et l´explication.
L´utilisation des sockets en C et C++ ne diffère pas ? (étant donné que j´ai plus tendance à programmer en C++)

Chaos_Clad
Chaos_Clad
Niveau 10
16 novembre 2007 à 00:49:32

Bon j´ai déjà un premier problème, j´utilise ce code, code d´exemple fourni sur un tuto de développez.net :
http://rafb.net/p/cxI1kx76.html
Seulement à la compilation il me signale des erreurs de linker pour chaque fonction spécifique aux sockets. Je suppose que ça vient du pragma, ne l´ayant jamais utilisé auparavant et ne sachant pas vraiment à quoi ça sert, je sais pas exactement quoi mettre d´autre. Je suis sous DEVC++ donc si vous avez des idées... :-)))

Geek-Puissant
Geek-Puissant
Niveau 8
16 novembre 2007 à 03:08:50

Je ne connais pas la réponse à ta question, mais tu devrais remplacer:

(SOCKADDR *)&sin

par

reinterpret_cast<const sockaddr*> (&sin)

Ça fait plus c++ :noel:

Fvirtman
Fvirtman
Niveau 10
16 novembre 2007 à 09:45:27

En réalité, il est d´usage de déclarer sin (le sin que tu mentionnes en haut de ton topic) comme une structure "sockaddr_in"
Mais certaines fonctions attendent une adresse vers une structure sockaddr. Autrement dit tu remplis une structure sockaddr_in, et avec le cast, tu lui fais croire que tu lui passes une structure sockaddr.

Utilisation standard dans cet exemple :
http://www.commentcamarchrche.net/sockets/sockfonc.php3

Dans un cas commun, cette manipulation est dangereuse, et il est déconseillé de l´utiliser (le moindre changement de structure décale les données, et ça bousille tout)
Mais en réseau, ça marche comme ça. Regardez les 2 structures :

http://msdn2.microsoft.coom/en-us/library/ms740496.aspx

On a sockaddr_in qui contient un short, puis d´autres données, et sockaddr, qui est plus générale, qui contient un short, puis un tableau de char.
Le tableau de char représente ici finalement un buffer quelconques, et les données remplies dans sockaddr_in sont finalement placées a des endroits précis du buffer.

Si vous regardez la page ci dessus, il y a d´autres structures, qui, elles aussi, pourront etre castées en sockaddr.

Finalement, je vois ça (vite fait) comme une sorte de polymorphisme, la classe mere étant sockaddr, qui dit "j´ai un short, plus un tampon de données", et les autres structures qui spécifient leur données de façon a remplir plus facilement le tampon de données.
C´est une astuce du langage C qui permet de faire - vite fait - une sorte de polymorphisme. Mais c´est super dangereux, il faut etre sur de son coup.
Pour le réseau, pas de soucis, car les structures ne bougent plus, et ne bougeront jamais. Cela permettra de manipuler de l´IP V6, voir meme les futures évolutions, de la meme maniere, grace a ce "polymorphisme". On remplira une structure "sockaddr_nouveautruc" puis on castera en sockaddr.

C´est la philosophie réseau.

Geek-puissant > non, justement, je pense qu´il ne faut pas mélanger ce passage en C, qui doit rester en C, avec du C++. (meme si ça n´aura pas d´incidents)
Disons que la philosophie du réseau est du C, et certains amoureux du réseau trouveront que c´est un sacrilege de mettre ici un static_cast.
Par contre, rien n´empeche d´encapsuler le réseau dans une classe, mais disons que tu encapsules tout, et donc tu fais abstraction de sockaddr et sockaddr_in que tu noies dans la classe.

dnob700
dnob700
Niveau 10
16 novembre 2007 à 22:48:59

le #pragma comment(lib,...) est un truc spécifique à visual C++ et je ne crois pas que dev C++ le comprenne (c´est d´ailleurs étonnant qu´il y ai un truc .a dedans, tu l´a changé ?) . Il faut que tu regarde dans lespropriété de ton programme dans dev c++, il y a un onglet "linker" je pense, et là tu ajoute dans la liste des bibliothèque à utiliser winsock.a ou un truc qui y ressemble.

Chaos_Clad
Chaos_Clad
Niveau 10
16 novembre 2007 à 23:06:03

Oui c´est moi qui ai modifié le .lib en .a en espérant que ça changerait quelque chose. C´est #pragma qui n´est pas reconnu par DEV ou #pragma comment ?
Merci à tous pour vos explications :-)))

dnob700
dnob700
Niveau 10
16 novembre 2007 à 23:28:02
  1. pragma comment(lib,...) qui n´est pas reconnu.

Je crois que #pragma comment, ça veut juste dire qu´on va dire n´importe quoi et qu´il en fasse ce qu´il veut.

et #pragma c´est ce par quoi commence toute les options spécifique à chaque compilo (ou tout simplement des directives pour le compilo qui sont parfois standardisé comme OpenMP).

Chaos_Clad
Chaos_Clad
Niveau 10
17 novembre 2007 à 00:23:51

Bon voilà j´ai légèrement avancé dans le tuto que tu m´as filé dnob et j´en suis à reprendre le morceau de code qu´ils donnent à la fin pour créer un petit serveur qui envoie une chaîne "Hello World !" au client.
J´ai donc ce code (j´ai volontairement enlevé la gestion des erreurs de bind() et compagnie pour aérer le code sinon j´ai du mal à m´y retrouver) :
http://rafb.net/p/0Ky3TD25.html

Donc j´ai essayé de jouer le rôle du client et du serveur à la fois. C´est-à-dire que je lance le programme dans une fenêtre, et dans une autre fenêtre je lance "telnet NOM_DE_MA_MACHINE 4000", mais il me dit que la connexion sur le port 4000 est impossible. Je sais pas d´où vient le problème donc si quelqu´un peut m´aider (encore une fois ^^), merci :)

dnob700
dnob700
Niveau 10
17 novembre 2007 à 17:49:35

c´est peut-être idiot, mais qu´est ce qui se passe si tu remplace NOM_DE_MA_MACHINE par localhost plutôt ?

Chaos_Clad
Chaos_Clad
Niveau 10
17 novembre 2007 à 17:54:19

Rien de plus, j´ai toujours le même message :
"Connexion à localhost... Impossible d´ouvrir une connexion à l´hôte, sur le port 4000 : échec lors de la connexion"

(le message est identique quelque soit le port que j´utilise)

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment