fonction bind() - C++ - Programmation
Marsh Posté le 04-03-2003 à 07:16:37
Peak a écrit :
|
c'est normal que ca plante, tu initialises ta structure et après tu remets tout à 0. met ton memset avant l'initialisation de ta structure.
Marsh Posté le 04-03-2003 à 11:47:01
quelqu'un aurai il une idée consernant la deuxieme question?
INADDR_ANY
est une constant contenant notre adrs ip (si j'ai bien compris) mais si la machinne à plusieurs adrs ip laquelle contient INADDR_ANY?
Je me demmandai aussi si il n'existai pas une sentinelle qui nous indique la fin du dernier paket lors d'une connection en general? et en particulier avec le systeme apache?
Marsh Posté le 04-03-2003 à 13:02:15
INADDR_ANY, c'est pour dire qu'on utilise n'importe quelle ip. donc tu écoutes sur toutes les interfaces.
Marsh Posté le 04-03-2003 à 16:55:16
ok, j'avai mal compris son rôle
thx.
quelqu'un a une idée pour ceci?:
Je me demmandai aussi si il n'existai pas une sentinelle placé (dans le buffer via le quelle on envoit nos données) qui nous indique la fin du dernier paket envoyé (protocol TCP/IP) lors d'une connection en general? et en particulier avec le systeme apache?
ou encore:
pk ce ci ne marche pas ?:
Code :
|
Marsh Posté le 04-03-2003 à 18:27:39
pk ce ci ne marche pas ?:
Code :
|
Marsh Posté le 04-03-2003 à 21:30:20
ça ne marchai toujours pas mais j'ai comme même fini par trouvé après une heure a m'aracher les cheveux!!!!!
c'est le else: (le fclose n'étai en fait qu'une faute de frappe
Code :
|
bon dans mon code c'est evidement pas ces conditions là mais la première est logiquement l'invers de la deuxieme donc je commence vraiment à me posé des question sur le C
Marsh Posté le 04-03-2003 à 21:46:59
Peak a écrit : ok, j'avai mal compris son rôle |
non, y a pas. En TCP, le flux commence à la connexion, et se termine quand tu fermes l'une des socket, il n'y aucune notion de début et de fin. C'est à toi de savoir si tu as besoin d'attendre des données ou pas.
La seule chose que garantit TCP, c'est que toutes les données envoyées sont reçue, et dans l'ordre. Mais sans notion de paquet.
Marsh Posté le 04-03-2003 à 22:13:28
mrBebert a écrit : non, y a pas. En TCP, le flux commence à la connexion, et se termine quand tu fermes l'une des socket, il n'y aucune notion de début et de fin. C'est à toi de savoir si tu as besoin d'attendre des données ou pas. |
En fait pour le protocole http g une méthode qui consiste a lire le header du fichier, mais g lu dans la rfc du protocole HTTP 1.1 que les pages ( et image) dynamiques ne pouvaient transmettre la taille du fichier dans le header.Existe-t il donc une meilleur sentinelle que "</html>" ? qui peut très bien avoir été omise, de plus ca ne s'applique pas sur les images dynamique.
Marsh Posté le 04-03-2003 à 22:29:45
Nico5779 a écrit : |
Je suppose que le serveur coupe la transmission lorsqu'il a envoyé toutes les données
Dans ce cas tu n'attend aucune balise, tu lis tant que la connexion est valable.
Marsh Posté le 04-03-2003 à 22:42:37
concretement comment on verifie que la connection est tj active?
Jusqu'ici je verifiait la valeur renvoyer par la fonction recv, si elle est nulle c que le serveur n'a rien envoyer,mais le prog met du temps a s'en rendre compte et le processus ne continue qu après un long delais d'attente.
Marsh Posté le 05-03-2003 à 19:27:23
Si la fonction 'recv' renvoie une valeur > 0, c'est qu'il y a des données dans le buffer et que la connexion est encore valable.
Si elle renvoie 0, c'est qu'il y a une erreur. Tu regardes la valeur de WSAGetLastError() pour connaitre l'erreur.
http://msdn.microsoft.com/library/ [...] recv_2.asp
Si ta socket n'est pas bloquante, tu as "l'erreur" WSAEWOULDBLOCK, qui t'indique qu'il n'y a aucune donnée à lire mais que la fonction se termine quand même car la socket est déclarée non bloquante.
Marsh Posté le 05-03-2003 à 20:43:44
Ben recv recoit bien la taille du buffer, pis zero a un moment.
Mais sur le link ke t as filer y as écrit
Citation : |
Donc ca devrait marcher sauf, que comme dit plus au haut au moment de l'execution de la fct recv qui va retourner zero ca traine pdt plusieur seconde.
Et la fct WSAGetLastError() me renvoi tj zero.
Ma socket est declaré blocante (je crois , par default) mais étant encore novice dans ce domaine g pas encore vraiment regarder comment on modifiait cette dernière et je maitrise pas ces notions, mais je suis pas sur que la declaré blocante va faire en sorte que la valeur renoyer WSAGetLastError() sera différente.Peux tu infirmer ou confirmer ceci?
Et sinon n'est tu pas sur que si il y as une erreur recv ne renvoi pas -1 plutot que zero?
Merci de ton aide
Marsh Posté le 05-03-2003 à 20:56:23
C'est peut être plutôt -1 en cas d'erreur, effectivement
Ca doit être ca alors. Le recv() reste en attente, et se termine avec 0 lorsque le serveur clot la connexion.
Ca me parait tout à fait logique. Tu as reçu toutes les données auxquelles tu t'attendais ?
Pour la différence de comportement entre une socket bloquante et une non-bloquante, c'est uniquement dans le cas où il n'y a pas de données à lire. Si elle est bloquante, ton programme reste en attente, sinon, le recv() renvoie 0, et tu dois tester le WSAGetLastError() pour savoir s'il s'agit de la fermeture de la connexion (erreur à 0), ou simplement qu'il n'y a pas de données à lire et que la socket n'attend pas (erreur = WSAEWOULDBLOCK).
C'est un peu paradoxal, il y a une "erreur" lorsque la connexion est toujours valide, et pas d'"erreur" lorsqu'elle est fermée
Marsh Posté le 05-03-2003 à 21:00:23
Nico5779 a écrit : vi je recois bien tout. |
Bon, ben c'est ca alors
Le serveur termine la connexion, et ton recv() renvoie 0 pour t'indiquer que la connexion est terminée.
Marsh Posté le 05-03-2003 à 21:06:40
non, au contraire
enfin, ca dépend de ce que tu veux faire. Tu déclares la socket non bloquante si tu veux que ton programme ne reste pas bloqué en attendant des données, tant que la connexion reste valide.
Manifestement, dans ton cas, il n'y a pas de problème. La connexion est fermée à la fin du transfert de données.
Tu peux la déclarer non bloquante si tu veux commencer à traiter les données alors que tu n'as pas encore tout reçu.
Marsh Posté le 05-03-2003 à 21:08:56
ah ok , mais pourquoi il met si longtemps alors ?
t as une idée?
Marsh Posté le 05-03-2003 à 21:16:36
En fait le principe de mon prog est simple, les données lues sont immédiatement renoyer sur un autre socket
Faire du multithread pourrait il alors règlé mon prob alors?
Je veux dire chaque requete créerait un nouveau thread dans lekel chaque socket serait non-blocante et renvoi les données a la volée ,au fur et a mesure qu'elle sont lues , comme ca le temps d'attente de chaque thread n'apparaitra pas chez le client définitif?
Marsh Posté le 05-03-2003 à 21:24:37
Ca te permettrait de renvoyer les données plus rapidement, en étant sur de ne pas devoir attendre que ton buffer soit plein avant de les retransmettre. Ca peut être une bonne idée
Par contre, si tes sockets sont non-bloquantes, as-tu besoin de plusieurs threads
Tu programmes quoi : un proxy ?
Marsh Posté le 05-03-2003 à 22:27:38
un genre de...
C juste un tunnel ki me permettra de hoster deux sites ou plus sur le port 80 d'un reseau avec un nom par machine, derrière une ip dynamique et grace a un services comme dyndns.
Et c kool que je puisse le faire simplement avec des socket non-blocante sans devoir faire de mutli-thread (que je devrait qd meme faire pour mon prog supporte plusieurs connections simultanées, c aurait été lourd a gèrer)
En tout cas un grand merci , tu m as bien orienté , g t vraiment bloquer
Marsh Posté le 05-03-2003 à 22:39:01
Pas de problème
Pour distinguer les sites, tu fais comment ? Tu regardes dans le protocole HTTP
Marsh Posté le 05-03-2003 à 22:40:05
bah vi, y as pas 36000 solutions
mais si t en a d autres c avec plaisir
Marsh Posté le 04-03-2003 à 03:07:06
j'y capte plus rien et desespere...
j'ai un problème avec mes socket et la fonction bind():
mon prog compile mais plante a l'execution (bind()<0) et perro m'affiche : "Address family not supported by protocol"
bon jusk'ici rien de bien special, mais le truc ki menerve le plus c'est ke ça marchai très bien hier et que j'ai exactement la même chose today si ce n'est ke j'ai juste coupé mon prog en module
kelk'un a une idée??
si y'a des motivé voila le bout de code ki pose problème :
J'en profite pour poser une autre question: INADDR_ANY
est une constant contenant notre adrs ip (si j'ai bien compris) mais si la machinne à plusieurs adrs ip laquelle contient INADDR_ANY?
Message édité par peak le 04-03-2003 à 03:08:35