Petite explication niveau sockets please... [C/Reseau] - C++ - Programmation
Marsh Posté le 09-09-2002 à 08:50:40
faut pas ouvrir 4 sockets !
seulement un de chaque coté
si t en mets plusieurs sur un même port, ca porte un autre nom
si ton paquete de "retour" ne fait juste que confirmer, alors c pas la peine, suffit d'utilier des socket TCP, et t'aura le meme resultat.
l'IP de l envoyer est dnas le paquet ,
si tu l enleve ou si tu la changes, spa bien
Marsh Posté le 09-09-2002 à 10:06:40
- Une socket (y compris en TCP), ca marche dans les 2 sens. Inutile d'en créer 2 sur le client.
Pour le serveur, c'est un peu différent. Tu crées une socket particulière, qui se met en attente de connexion (ton appli reste bloquée à ce moment là. A toi d'en tenir compte). Dès qu'une connexion arrive (un client qui cherche à se connecter), la fonction dans laquelle tu étais bloqué retourne un résultat, qui est une nouvelle socket, connectée chez le client. Tu communiques donc avec le client sur cette nouvelle socket, et tu peux remettre la première socket en attente, au cas où un nouveau client arrive.
- Pour le serveur, tu dois fixer le numéro de port (faut bien que le client sache où s'adresser). Par contre, pour le client, c'est inutile. Tu peux laisser le système trouver un port disponible tout seul.
- Quand une socket est connectée, on peut connaître l'IP/port de celui qui est de l'autre côté (je parle de socket connectées, c'est à dire en TCP. En UDP, c'est différent).
Marsh Posté le 09-09-2002 à 10:20:40
Salut,
Je me débrouille pas mal en client/serveur en C (si moi je dis ça, et bien !).
Si tu veux une aide dévouée , mail moi (juju-le-barbare@fr.fm)
@++
Marsh Posté le 09-09-2002 à 18:31:15
ah vi, je dois absolument utiliser les sockets UDP...
Donc en gros, 2 sockets de chaque cote ca sert a rien ? je vais tester...
Marsh Posté le 09-09-2002 à 18:36:54
Arf, quand je mets 2 sockets differents, le bind marche bieng.
Si j;utilise le meme, le bind passe pas...
Donc y en faut bien 2 differents non ?
Marsh Posté le 09-09-2002 à 18:55:03
d'ailleurs, en clair, il sert a quoi le bind...
Pourquoi il en faut un avant de recevoir et pas avant d'envoyer...
bon, j'ai pondu ca :
server.c
Code :
|
Client.c
Code :
|
Vous me dites c'est du bidouillage je vous reponds ouiiiiiiiiiiii
Mais bon, avec ca, le server attends son paquet, je lance le client qui envoie son paquet, le server le recoit et trouve le bon contenu, envoie le sien... que le client recit jamais
Vous pouvez m'expliquer ?
Marsh Posté le 09-09-2002 à 20:06:30
beng ?
Chuis vraiment bloqued la
Marsh Posté le 09-09-2002 à 21:37:05
c quoi le pb en fiat ?!
t as bien initialise les structures sockaddr ?!
-> ou ca pose pb ?
a la creation du socket ? au bind ? au send ? au recv ?
Marsh Posté le 09-09-2002 à 23:49:00
Hum, perso, en UDP j'ai toujours ouvert 2 sockets sur le client et 2 sur le serveur.Ca marchait bien et je crois pas que tu puisse faire autrement.
Cependant, en TCP je te confirme qu'une seule socket (c masculin ou féminin je sais jamais) sur le client suffit et 2 sur le serveur (1 socket de rendez-vous où le client se connecte au début, et 1 socket par client). En TCP une socket marche dans les 2 sens.
En UDP, je suis pas sûr !
Marsh Posté le 09-09-2002 à 23:56:30
arf, j'ai un doute, mais je crois que j'ai jamais fait 2 socket en udp....
server : create -> bind -> recvfrom/sendto
client : create -> recvfrom/sendto
pour ton socket udp, tu mets :
AF_INET, SOCK_STREAM, IPPROTO_TCP comme para ?!
Marsh Posté le 10-09-2002 à 00:28:37
nop !
Ya toujours qu'un seul socket de chaque coté !
Ces 2 sockets forment un seul tube de communication (connecté ou non selon que c'est TCP/UDP)
Si tu veux créer plusieurs sockets, c'est éventuellement du côté serveur TCP, qui lorsqu'il reçoit une connection d'un client créé une socket puis fork le processus, et pendant ce temps le père se remet en écoute (on peut définir le nombre maxi de clients dans l'appel à listen())
N'oublie pas select() si tu veux autoriser plusieurs clients.
@++
Marsh Posté le 10-09-2002 à 02:56:09
ouiiiiiiiii merci ca maaaaaaaaaarche
Je reviendrai surement poser des questions, mais l;echange de paquets fonctionne enfin
Marsh Posté le 10-09-2002 à 10:02:02
Tetedeiench a écrit a écrit : ah vi, je dois absolument utiliser les sockets UDP... Donc en gros, 2 sockets de chaque cote ca sert a rien ? je vais tester... |
En UDP, c'est différent. Tu n'as pas la notion de connexion.
Dans ce cas, une seule socket suffira côté serveur. Elle recevra les paquets de tous les clients, et tu peux regarder pour chacun d'eux d'où il vient (pratique si tu veux envoyer une réponse).
UDP respecte les limites des paquets. C'est à dire que si un client envoie un paquet de 149 octets, le serveur recevra d'un seul bloc les 149 octets. Où ne recevra rien du tout.
Il n'y aucun engagement sur le fait que le paquet ait été reçu. C'est à toi de mettre en place un dispositif d'accusé réception si tu as besoin d'être sur que la paquet est bien arrivé à destination (contrairement à TCP).
Pour le bind, ce n'est pas obligatoire. Tu t'en sert si tu veux que ta socket soit sur un port déterminé. Sinon, c'est l'OS qui te la met où il veut.
Marsh Posté le 10-09-2002 à 15:39:08
Tetedeiench a écrit a écrit : ouiiiiiiiii merci ca maaaaaaaaaarche Je reviendrai surement poser des questions, mais l;echange de paquets fonctionne enfin |
ben dis nous plutôt ce que tu as fait pour que ça marche
Marsh Posté le 10-09-2002 à 17:38:39
mrbebert a écrit a écrit : En UDP, c'est différent. Tu n'as pas la notion de connexion. Dans ce cas, une seule socket suffira côté serveur. Elle recevra les paquets de tous les clients, et tu peux regarder pour chacun d'eux d'où il vient (pratique si tu veux envoyer une réponse). UDP respecte les limites des paquets. C'est à dire que si un client envoie un paquet de 149 octets, le serveur recevra d'un seul bloc les 149 octets. Où ne recevra rien du tout. Il n'y aucun engagement sur le fait que le paquet ait été reçu. C'est à toi de mettre en place un dispositif d'accusé réception si tu as besoin d'être sur que la paquet est bien arrivé à destination (contrairement à TCP). Pour le bind, ce n'est pas obligatoire. Tu t'en sert si tu veux que ta socket soit sur un port déterminé. Sinon, c'est l'OS qui te la met où il veut. |
tout à fait d'accord ! Je m'en rapelle jamais, mais c'est ca !
Marsh Posté le 11-09-2002 à 04:50:04
juju-le-barbare a écrit a écrit : ben dis nous plutôt ce que tu as fait pour que ça marche |
j'ai tout repris a zero.
En bidouillant un seul socket de chaque cote, et en ne bindant QUE du cote server.
Chai pas pkoi, mais ca amrche d'enfer
Me reste a threader le bordel et zouuuu, project closed
Va falloir que je demande au prof aussi comment il envoie un entier dans un paquet... de telle sorte qu;il soit lisible par n'importe quelle becane, que ce soit un Sparc qu'un RISC ou un CISC...
Car la, en changeant d'archi, ca merde legerement
Marsh Posté le 11-09-2002 à 09:39:23
regarde les fonction ntohl et htonl :
- htonl convertit un long au format 'network'
- ntohl convertit du format network au format local utilisé par la machine
http://search.microsoft.com/gomsur [...] tohl_2.asp
De même, tu as htons pour les entiers sur 2 octets.
Edit : ce lien là est mieux :
http://search.microsoft.com/gomsur [...] dering.asp
Marsh Posté le 09-09-2002 à 03:07:59
Je dois faire une relation client/server en C, pour l'instant ca se limite a :
Je lance le serveur qui attend un paquet.
Je lance le client qui balance un paquet au serveur pour dire bonjour et lui filer son IP dedans.
Le serveur envoie un paquet de confirmation au client.
Je vais donc avoir besoin de sockets pour faire ca...
J'ai declare deux sockets pour le client ( Un pour envoyer, un pour recevoir ) et deux pour le serveur ( idem).
Ma question est :
-On peut utiliser un meme socket pour envoyer/recevoir des paquets ?
-Si je lance le serveur et le client sur la meme becane, ca fera 4 sockets sur le meme port... c'est pas un peu beaucoup ?
Pour l'instant, le client envoie un paquet au serveur. Ce dernier le recoit bien, et envoie son paquet de confirmation... mais le client le recoit jamais
D'ou mes questions sur les sockets...
Ah vi, si on a un paquet, on peux connaitre l'IP de l'envoyeur, meme si elle n;est pas dans le "contenu" du paquet ?
Merci
---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !