Client/Server simplifié.... [winsock] - C - Programmation
Marsh Posté le 27-08-2006 à 13:12:13
Salut
Je croi que ta oublier de liberer ta socket:
Code :
|
à la fin , essay ca peut toujours servir
Marsh Posté le 27-08-2006 à 13:29:39
big_dadi_fat a écrit : Salut
|
j'ai ajouter close(sock) et WSACleanup() mais c'été pas ca qui créai le problème
Marsh Posté le 27-08-2006 à 13:33:42
Bad_Day a écrit : Jai essayé de faire un petit programme Client/serveur très très simplifié, dont voilà le code : |
Déjà, es-tu bien conscient que fgets() prend le '\n' ? Pour l'IP, ça va pas le faire...
Ensuite, tu utilises strlen() à l'emission, donc tu ne transmets pas le 0. Normal.
Par contre, en réception, il faut utiliser le nombre de caractères reçus (renvoyé par recv()) pour placer le 0 au bon endroit... OK, mais il faut laisser une place pour le 0 :
Code :
|
http://mapage.noos.fr/emdel/reseaux.htm
Pour le problème de boucle, il faut tester la valeur retournée par recv(). En cas de deconnexion, c'est -1...
Marsh Posté le 27-08-2006 à 13:51:05
Emmanuel Delahaye a écrit : Déjà, es-tu bien conscient que fgets() prend le '\n' ? Pour l'IP, ça va pas le faire...
|
EDIT: je chérchais depuis un moment un site en francais qui explique bien les socket avec des exemple etc .. et le lien http://mapage.noos.fr/emdel/reseaux.html me plais , je ne vois pas comment je ne l'ai pas trouvé avant, LoOoL .
merci Emmanue, je vais essayé de corrigé tout ça
il y a encors un autre probléme :
quand je saisi le numéro de port et valide par ok y a un message vide qui est envoyé au server ! c'est à cause du scanf ?
Marsh Posté le 27-08-2006 à 14:13:24
Bad_Day a écrit : quand je saisi le numéro de port et valide par ok y a un message vide qui est envoyé au server ! c'est à cause du scanf ? |
Possible qu'il y ait un '\n' qui traine. Je n'utilise pas scanf()... Trop compliqué.
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers
Il vaut mieux maîtriser le C avant de se lancer dans les chaussettes...
Marsh Posté le 27-08-2006 à 14:19:40
Emmanuel Delahaye a écrit : Possible qu'il y ait un '\n' qui traine. Je n'utilise pas scanf()... Trop compliqué. |
Oui c'est vrai que l'utilisation du scanf est souvant dangeureuse. J'ai lu un tuto sur la bonne utilisation de scanf sur developpez (je ne me rappel plu du lien) mais c'est un peut chaud d'utiliser scanf correctement lol.
Citation : Il vaut mieux maîtriser le C avant de se lancer dans les chaussettes |
LoOoL
Marsh Posté le 27-08-2006 à 14:34:54
Encor un petit problème . svp:
J'ai commencé avec les socket il n y a qu'un jours donc je débute : et
Je ne comprend pas bien le fonctionement de la fonction accept:
càd:
quand je fais
Code :
|
ca marche. Mais si je fais directement:
Code :
|
il me met un warning (genr: invalid type convertion (cast)), et au début de l'execution il y a une boucle infini de message. (meme si je cast).
donc je ne comprend pas differance entre les 2 code .
Marsh Posté le 27-08-2006 à 15:00:14
Bad_Day a écrit : Je ne comprend pas bien le fonctionement de la fonction accept:
|
C'est un problème de C. Si une fonction attend l'adresse d'une variable, il ne faut pas lui donner autre chose, sinon, le comportement est indéfini...
Une taille, c'est pas l'adresse d'une variable...
Marsh Posté le 27-08-2006 à 15:14:32
Emmanuel Delahaye a écrit : C'est un problème de C. Si une fonction attend l'adresse d'une variable, il ne faut pas lui donner autre chose, sinon, le comportement est indéfini... |
ah ok, donc la fonction accept() à comme 3eme parametre un pointeur sur la variable qui contien la taille de notre structure . Je pensais que c'été la taille de la structure qu'elle prend.
ok et bien merci pour votre aide et pour les liens que vous m'avais donnez.
Marsh Posté le 28-08-2006 à 13:58:32
Re-salut
J'ai un peut lu les exemple de client server qu'il y a sur le site http://mapage.noos.fr/emdel/reseaux.htm que vous m'avez donné, mais j'ai un petit problème à comprendre des petit truc dans ces code:
par exemple:
Code :
|
moi j'ai toujours utilisé: close(sock); tout court lol, et je ne comprend pas ce code là .
et aussi:
Code :
|
à quoi ca sert ca .
Je suis vraiment désolé si se sont des questions bettes . mais SVP expliquez moi.
Merci Emmanuel.
Marsh Posté le 28-08-2006 à 14:09:01
Bad_Day a écrit :
|
close() n'existe pas sous Windows. C'est closesocket().
Sous unixoide, on met soit close(), soit closesocket() avec un define.
Code :
|
J'ai fourni un fichier d'entête qui permet la compatibilité unix/windows...
Citation :
|
perror() est une fonction standard du C.
Marsh Posté le 28-08-2006 à 14:21:43
ok, donc j'utilise closesocket (sock); .Mais je vois que vous mettez un virgule aprés et sock = INVALID_SOCKET;
Code :
|
j'ai jamais vu ca avant lol, a quoi ca sert ?
Citation : perror() est une fonction standard du C |
Ok , mais j'ai trouvé http://www.linux-kheops.com/doc/ma [...] ror.3.html qu'on dois passé une chaine de caractére a cette fonction, or je ne comprend pas bien la singification de "socket.open" et "socket.close" , esque ce sont les chaine de caractére que La fonction perror() affiche sur la sortie d'erreur standard ?
Marsh Posté le 28-08-2006 à 15:41:28
Bad_Day a écrit : ok, donc j'utilise closesocket (sock); .Mais je vois que vous mettez un virgule aprés et sock = INVALID_SOCKET;
|
Comme on a fermé le socket, sa valeur n'est plus valide. Je le force donc à une valeur explicitement invalide (ça bugge plus vite et de manière certaine en cas de réutilisation abusive). Ca permet de le tester. Comme avec un pointeur et NULL...
Ici, l'opérateur ',' n'a pas de rôle fonctionnel particulier, si ce n'est qu'il prétend montrer à l'utilisateur du code que la séquence de code doit être respectée. (Ne rien mettre entre les deux instructions).
Citation :
|
La chaine de caractère n'a qu'un rôle documentaire. Elle permet de savoir de quoi on parle.
Comme indiqué dans la doc, la chaine et le message d'erreur sont sortis sur la sortie erreur (stderr).
Marsh Posté le 28-08-2006 à 15:57:26
Ok merci pour votre explication, je vais me remetre au code qu'il y a sur ton site .
j'ai aussi trouvé ce tuto en francais il est complais (mais c'est pour unix ) , enfin bref http://vidalcharles.free.fr/lf/socket.html
encor merci
Marsh Posté le 28-08-2006 à 16:57:49
Bad_Day a écrit : j'ai aussi trouvé ce tuto en francais il est compl |
J'ai pas tout lu en détail, mais le gars est mûr pour écrire un tuto pour le Site du Zéro !
Marsh Posté le 30-08-2006 à 13:46:20
Re
J'ai un peut amélioré le petit code du server en suivant un peut l'exemple sur ton site:
Code :
|
mais il y a des truc que je ne comprend pas vraiment bien, comme par exemple :
la fonction inet_ntoa(csin.sin_addr); (networck to acci) que vous utilisez pour identifier le client qui se connecte au server.
et htons(csin.sin_port); c'est pour idantifier le port ? je croyais que c'été le port 1000 (dans cette exemple) ! ou alors un autre port
et j'ai aussi un autre probléme dans ce bout de code:
Code :
|
J'ai essayais d'afficher le sizeof(bufferRecv) et la valeur retourné par la fonction recv() , mais il me donne des résultat spectaculére .
je ne vois pas ou est le probléme.. snif
Marsh Posté le 30-08-2006 à 18:12:37
Bad_Day a écrit : |
cette fonction transforme l'adresse IP du client en une chaine imprimable.
|
Apparement, ça fonctionne pas mal...
Citation : |
Ben oui, c'est le port du cient. Il est attribué automatiquement pas le système du client.
Citation :
|
Moi, avec ton code, je vois 799...
<[ Serveur ]> |
soit 800 - 1. Rien de spéctaculaire.
Ensuite, je vois 1 (j'ai tapé 'a', soit 1 caractère) et le 'a' que j'ai tapé sur le client Telnet.
Rien que de très normal.
Par contre, avec un client Telnet (terminal caractères), la caractères arrivent un par un. C'est à toi de les assembler (le \n ou \r est la fin de commande) pour constituer une commande complète et valide. Ajouer le 0 final.
Marsh Posté le 31-08-2006 à 14:42:13
RE...
J'ai essayer de faire communiquer le client et le serveur (echanger des msg entre les 2 parties).
Voilà le code:
serveur:
Code :
|
client:
Code :
|
Mais le problème cette fois c'est qu'au début ca marche mais à un sertein moment y a un décalage de message (et fais n'importe quoi) .
Je ne vois pas bien où le prob peut-il bien être .
Marsh Posté le 31-08-2006 à 15:27:40
Bad_Day a écrit : RE... |
A l'emission, du serveur, tu fais :
Code :
|
Autrement dit, tu transmets systématiquement un bloc de 50 bytes, y compris le 0 final et des caractères non initialisés si la chaine utile fait moins de 48 caractères.
A la reception du serveur, tu fais :
Code :
|
autrement dit, tu places un 0 après les caractères reçus. C'est OK, sauf que ce qui est reçu (en fait, ce qui a été émis) est incorrect. Mais comme le 0 a été transmis, ça marchouille.
Il serait plus logique de ne transmettre que les caractères utiles :
Code :
|
Je n'ai pas vérifié le sens serv -> cli.
Marsh Posté le 01-09-2006 à 18:28:48
Salut
moi j'ai fait un programme pareille au tien,
il marche si je l'essay sur ma machine en local avec l'ip 127.0.0.1 .
Mais dés que je l'essay sur une autre machine avec la bonne adresse IP,
sa ne marche pas
ce né pas un probléme de code j'ai meme essayer avec ton code là ici préson, alors je ne voi pas ou est le prob
Marsh Posté le 01-09-2006 à 19:25:26
big_dadi_fat a écrit : Salut |
port < 1024 ? Blocage par le FireWall ?
Marsh Posté le 01-09-2006 à 20:34:01
Emmanuel Delahaye a écrit : port < 1024 ? Blocage par le FireWall ? |
J'ai essayer avec le port 1000 , comme dans l'exemple si dessu , et il n y a pas blocage par le FireWall, j'ai fait débloqué.
Marsh Posté le 01-09-2006 à 20:55:18
big_dadi_fat a écrit : J'ai essayer avec le port 1000 , comme dans l'exemple si dessu , et il n y a pas blocage par le FireWall, j'ai fait débloqué. |
Essaye avec un port >= 1024. Sous Linux, les ports < 1024 ne sont gérables qu'en mode root. Sous Windows, c'est pas très clair...
Marsh Posté le 02-09-2006 à 17:22:42
C'est vraie que moi aussi je n'ai jamais essayer sur un autre pc . j'ai un seul
Marsh Posté le 02-09-2006 à 20:05:42
big_dadi_fat a écrit : J'ai essayer avec le port 1000 , comme dans l'exemple si dessu , et il n y a pas blocage par le FireWall, j'ai fait débloqué. |
tu devra essayer avec un port supérieur à 1024 ,
j'ai essayé avec 1000 et ca ne marchais pas comme toi , j'ai essayé avec 2000 et ca marche bien .
enfait je me demande ci en peut faire en sorte que le client et le serveur peuvent envoyé des msg tout les 2 , càd en méme temp .
j'ai essayé mais je n'arrive pas a le fair . il faut toujours attendre la reponce du clien pour que le serveur puisse envoyé , et ainsi de suit ....
esqu'on peut le faire...
voila les nouveau code:
Code :
|
Code :
|
merci
Marsh Posté le 27-08-2006 à 13:07:17
Salut tout le monde.
Tout dabor je tien a préciser que je suis débutant avec lutilisation des sockets en langage C, alors ne soyez pas surpris si ma question parés bette ! LoOoL.
Jai essayé de faire un petit programme Client/serveur très très simplifié, dont voilà le code :
Client :
Server :
Le problème cest que quand le client envoi un message au server ca marche il laffiche, mais dés que je ferme le client le server affiche le dernier message envoyé sans arrêt càd un boucle infini !
Et je ne vois pas où le problème peut-il bien être !
Merci pour votre aide.
A bien tôt.
Message édité par Bad_Day le 28-08-2006 à 13:47:54