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

[C]Sockets et client qui est navigateur

Lagrangien
Lagrangien
Niveau 8
06 décembre 2012 à 14:38:07

Voilà, j'ai un code assez simple, server.c, qui utilise les sockets pour pouvoir communiquer sur le réseau.

Avec le programme généré par un code client.c idoine, ça fonctionne. On peut par exemple échanger des messages du client au server.

Maintenant, j'aimerais (je dois, en fait) ouvrir mon navigateur (ici firefox) , taper : localhost:<numero de port> dans la barre d'adresse, et j'aimerais que le server récupère le "GET / HTTP/1.1" auquel on s'attend.Pour cela j'utilise la fonction recv().

Je vais vous poster le code. Mon problème, c'est que le programme serveur (lancé dans la console, donc) reste bloqué à l'étape "listening port <num de port>...".

SAUF : une des première fois que j'ai essayé. Là le serveur avait bien récupéré la requête du client. Mais là ça fait plusieurs heures que je cherche obstinément la raison qui fait que ça ne marche plus.

Merci beaucoup d'avance.

http://pastebin.com/2pJjcWCb

Lagrangien
Lagrangien
Niveau 8
06 décembre 2012 à 14:49:07

À noter que le navigateur, pendant ce temps, reste en attente (ça par contre c'est cool, ça veut dire qu'il se passe quelque chose, parce que quand je lui demande la même chose quand le serveur ne tourne pas, il ne se met pas en attente comme ça. )

godrik
godrik
Niveau 30
06 décembre 2012 à 15:53:18

ligne 52

Lagrangien
Lagrangien
Niveau 8
06 décembre 2012 à 16:09:48

Merci mais malheureusement il bloque avant la boucle je crois.

J'ai recompilé en supprimant purement et simplement le while (ce qui était dans la boucle est donc simplement à la suite du code qui précédait le while) et le serveur est toujours bloqué à son listening port ...

Et si le while(1) était un problème, j'aurais néanmoins dû voir s'afficher le message "Waiting for a client on port <num port>" (voir code), non ?

godrik
godrik
Niveau 30
06 décembre 2012 à 16:31:58

boulet! :)

while(1);

pas de ; ici! utilise un debugger pour voir ce qu'il se passe.

Lagrangien
Lagrangien
Niveau 8
06 décembre 2012 à 16:54:17

Tu es mon héros ! :fete:

Je comprend pourquoi ça avait marché une fois : j'avais transformé mon while en do while, puis quand je suis revenu au while j'ai fait un ctrl-c foireux, et voilà...

Et petite question puisqu'on y est : il est possible de faire la même chose, mais en utilisant select() pour gérer les différents clients "simultanés", ou quelque chose nous en empeche ?

Merci encore :ange:

godrik
godrik
Niveau 30
06 décembre 2012 à 17:10:54

select ca marche bien. C'est un peu chiant a ecrire cependant.

Lagrangien
Lagrangien
Niveau 8
07 décembre 2012 à 22:49:11

Je up, tout marche nickel, je communique comme je veux du server au client (browser) et vice versa... Mais en réseau uniquement.

C'est à dire que quand j'accede au serveur en tapant localhost:8080 (si 8080 est le port choisi par le serveur) ca marche. Si je tape l'adresse du réseau local ca marche aussi (192.168.etc..:8080).

Mais quand j'essaie de le faire sur le réseau internet, ça marche pas. Ni depuis la même machine, ni depuis une autre machine d'un réseau distant.

J'indique comment je m'y prend : je récupère l'adresse ip de la machine qui tient le serveur (je vais sur un site qui donne l'adresse IP genre whatismyip.com), puis je demande à mon testeur de tenter d'accéder au site en tapant <l'adresse ip>:8080 dans son navigateur. Mais il ne parvient pas à accéder au site. Je fais quelque chose de mal?

lokilok
lokilok
Niveau 17
07 décembre 2012 à 22:54:46

Tu as ouvert le port 8080 au moins ?

godrik
godrik
Niveau 30
07 décembre 2012 à 22:55:13

C'est certainement une histoire de nat/pat. Tu es certainement derriere une foobox. l'adresse que tu obtiens quand tu va sur whatismyip.com est l'addresse de la foobox pas l'adresse du serveur qui est derriere. Il faut donc configurer la fooxbox pour faire le relai entre un port en particulier et le serveur. Ca s'appelle NAT/PAT. Je ne sais pas comment ta foobox l'appelle.

Lagrangien
Lagrangien
Niveau 8
08 décembre 2012 à 01:36:24

LOKILOK : je n'ai touché à rien, mais j'imagine que si ça marche avec localhost sur le port 8080, c'est que le port 8080 est ouvert non ? C'est mon cas en tout cas.

godrik : Ok alors je vais voir de ce côté, mais c'est plutôt une bonne nouvelle pour moi. Si le programme fait exactement ce que je veux et a le comportement attendu en tout point lorsque je le teste avec localhost, tu confirmes qu'il ne peut pas y avoir (normalement) de raison venant du code source pour que le serveur soit inatteignable en le testant avec une adresse ip internet ?

Vous n'imaginez pas mon émotion, à part ça. Il y a un an environ je commençais la programmation (pour des besoins en physique, je ne suis pas du tout programmeur à la base) et si on m'avait dit que 400 jours plus tard je pourrais concevoir des programmes qui communiquent entre eux à travers le réseau ou entre eux à l'aide de pipes FIFOS, que je pourrais créer graphiquement tout ce que mon imagination désire avec la SDL, etc, je n'y aurais pas cru... :snif: Merci. Sans les forums ça aurait été impossible pour un autodidacte, j'ai l'impression, en tout cas avec mes capacités^^. Continuez d'aider les newbies, même si ils sont parfois redondants ; vous n'imaginez pas comme d'anodins commentaires peuvent être utiles.

godrik
godrik
Niveau 30
08 décembre 2012 à 03:05:45

Lagrangien, non il n'y a pas grandchose qui peut se mettre dans le chemin. Fait attention a la creation de ta socket serveur (celle sur laquelle tu fais un appel a listen). Il y a des parametres qui definisse sur quelle(s) interface(s) reseau(x) et adresse(s) tu ecoutes. Il est possible de se placer en ecoute sur uniquement une interface mais pas sur une autre.
Le probleme que tu as est certainement une histoire de firewall ou de translation d'adresse au niveau du routeur. Probablement pas un probleme applicatif.

"si on m'avait dit que 400 jours plus tard je pourrais concevoir des programmes qui ..."
Je suis heureux que tu ais reussit a te former. Par curiosite, quelles ont ete tes sources d'informations/cours?

Lagrangien
Lagrangien
Niveau 8
08 décembre 2012 à 11:59:47

J'ai commencé à toucher à la programmation en C++ avec un cours bizarre qui était dispensé aux physiciens de ma fac, mais on faisait vraiment rien d'incroyable, que des calculs, pas d'utilisation de classes, je ne savais même pas ce qu'était un pointeur.

Ensuite comme ça m'a plu j'ai repris le C++ depuis le début sur le SDZ (oui, bouh, tout ça, c'est mal je sais^^). J'ai suivi le tuto de base sur le C++, puis celui du C, puis j'ai enchainé avec celui sur la SDL, et c'est à partir de là que ça m'a forcé à vraiment bidouiller par moi même et aller grapiller des infos ça et là sur le net. J'ai du mal à dire quel cours j'ai suivi, parce que j'ai vraiment pris des miettes sur chaque sujet, parfois en anglais, parfois en français, parfois sur des sites vraiment étranges et de derrière les fagots, parfois sur developpez.net. Mais je dois dire d'une manière globale que j'ai surtout beaucoup appris (80%) en regardant les exemples et les problèmes des gens sur stackoverflow, developpez.net et le forum de JVC(ici), et peu avec de vrais cours.

Quand on me fait remarquer que je n'ai jamais suivi un véritable cours, je me rassure en me disant que je ne suis pas un vrai programmeur :-)

lokilok
lokilok
Niveau 17
08 décembre 2012 à 12:01:10

"je n'ai touché à rien, mais j'imagine que si ça marche avec localhost sur le port 8080, c'est que le port 8080 est ouvert non ? C'est mon cas en tout cas. "

Non, en local comme tu utilise les IP de tes ordinateurs pas besoin d'ouvrir de ports, mais par contre quand c'est en WAN tu dois car ton IP désigne ton réseau, et non un ordi en particulier.

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