Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2997 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  fonction bind()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fonction bind()

n°322249
peak
Posté le 04-03-2003 à 03:07:06  profilanswer
 

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 :

Code :
  1. struct hostent *ptrh;
  2. struct protoent *ptrp;
  3. struct sockaddr_in sad;
  4. int ss;
  5. int port;
  6. sad.sin_family = AF_INET;
  7. sad.sin_addr.s_addr = INADDR_ANY;
  8. port = PROTOPORT;
  9. memset((char *)&sad,0,sizeof(sad));
  10. if (port > 0)
  11.  sad.sin_port = htons((u_short) port);
  12. else
  13. {
  14.  erreur_fatale("numero de port invalide" );
  15. }
  16. if (((int)(ptrp = getprotobyname("tcp" ))) ==0)
  17. {
  18.  erreur_fatale("conversion de \"tcp\" impossible" );
  19. }
  20. ss = socket(PF_INET, SOCK_STREAM , ptrp->p_proto);
  21. if (ss < 0)
  22. {
  23.  erreur_fatale("erreur (socket)" );
  24.  exit(EXIT_FAILURE);
  25. }
  26. if (bind(ss,(struct sockaddr *)&sad, sizeof(sad))<0)
  27. {
  28.  erreur_fatale("erreur (bind)" );
  29.         //ADRESS fAMILY NOT SUPPORTED BY PROTOCOL!!?
  30. }
  31. if (listen(ss ,QLEN) < 0)
  32. {
  33.  erreur_fatale("erreur (listen)" );
  34. }
  35. return ss;


 
 
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
mood
Publicité
Posté le 04-03-2003 à 03:07:06  profilanswer
 

n°322253
gloop
Posté le 04-03-2003 à 07:16:37  profilanswer
 

Peak a écrit :


Code :
  1. sad.sin_family = AF_INET;
  2. sad.sin_addr.s_addr = INADDR_ANY;
  3. port = PROTOPORT;
  4. memset((char *)&sad,0,sizeof(sad));




 
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.

n°322402
peak
Posté le 04-03-2003 à 11:23:41  profilanswer
 

:whistle:  
 
MERCI!!
 :D

n°322421
peak
Posté le 04-03-2003 à 11:47:01  profilanswer
 

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?

n°322475
gloop
Posté le 04-03-2003 à 13:02:15  profilanswer
 

INADDR_ANY, c'est pour dire qu'on utilise n'importe quelle ip. donc tu écoutes sur toutes les interfaces.

n°322709
peak
Posté le 04-03-2003 à 16:55:16  profilanswer
 

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 :
  1. FILE *file;
  2. if(x==1)
  3.    if((file = (fopen("./F1", "r" ) == NULL)
  4.        printf("erreur;" )
  5. else
  6.    if((file = fopen("./F2", "r" )) == NULL)
  7.        printf("erreur;" )
  8. close(file)
  9. //"Segmentation fault"


Message édité par peak le 04-03-2003 à 16:58:19
n°322799
SomeBugsIn​Me
life suxx
Posté le 04-03-2003 à 18:27:39  profilanswer
 

pk ce ci ne marche pas ?:

Code :
  1. FILE *file;
  2. if(x==1)
  3.    if((file = (fopen("./F1", "r" ) == NULL)
  4.        printf("erreur;" )
  5. else
  6.    if((file = fopen("./F2", "r" )) == NULL)
  7.        printf("erreur;" )
  8. fclose(file); // c'est fclose et non close
  9. //"Segmentation fault"


n°322963
peak
Posté le 04-03-2003 à 21:30:20  profilanswer
 

ç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 :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define false '0'
  4. #define true '1'
  5. int main(int argc, char* argv)
  6. {
  7. FILE *file;
  8. char x=getchar();
  9. if(x==true)     
  10.  if((file = fopen("./F1", "r" )) == NULL) 
  11.   perror("" );
  12.        /*else*/ if(x==false)
  13.         if((file = fopen("./F2", "r" )) == NULL) 
  14.   perror("" );
  15. fclose(file);
  16. return 0;
  17. /*plante avec le else et marche avec le if!? y'a des jours comme ça où on ferai mieux de pas se lever!!*/
  18. }


 
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 :heink:  

n°322971
mrbebert
Posté le 04-03-2003 à 21:46:59  profilanswer
 

Peak a écrit :

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?  
...

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.


Message édité par mrbebert le 04-03-2003 à 21:47:36
n°322993
Nico5779
Posté le 04-03-2003 à 22:13:28  profilanswer
 

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.
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.


 
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.
 
 

mood
Publicité
Posté le 04-03-2003 à 22:13:28  profilanswer
 

n°323003
mrbebert
Posté le 04-03-2003 à 22:29:45  profilanswer
 

Nico5779 a écrit :


 
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.

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.

n°323011
Nico5779
Posté le 04-03-2003 à 22:42:37  profilanswer
 

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.
 
 

n°323874
mrbebert
Posté le 05-03-2003 à 19:27:23  profilanswer
 

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.

n°323917
Nico5779
Posté le 05-03-2003 à 20:43:44  profilanswer
 

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 :


If the connection has been gracefully closed, the return value is zero

 
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  :)


Message édité par Nico5779 le 05-03-2003 à 20:44:34
n°323923
mrbebert
Posté le 05-03-2003 à 20:56:23  profilanswer
 

C'est peut être plutôt -1 en cas d'erreur, effectivement :whistle:  
 
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 :pt1cable:


Message édité par mrbebert le 05-03-2003 à 20:59:34
n°323925
Nico5779
Posté le 05-03-2003 à 20:57:51  profilanswer
 

vi je recois bien tout.

n°323929
mrbebert
Posté le 05-03-2003 à 21:00:23  profilanswer
 

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.

n°323936
Nico5779
Posté le 05-03-2003 à 21:04:23  profilanswer
 

Donc je dois effectivement la déclarée non-blocantes?

n°323938
mrbebert
Posté le 05-03-2003 à 21:06:40  profilanswer
 

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.


Message édité par mrbebert le 05-03-2003 à 21:07:23
n°323940
Nico5779
Posté le 05-03-2003 à 21:08:56  profilanswer
 

ah ok , mais pourquoi il met si longtemps alors ?
t as une idée?

n°323947
Nico5779
Posté le 05-03-2003 à 21:16:36  profilanswer
 

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?

n°323951
mrbebert
Posté le 05-03-2003 à 21:24:37  profilanswer
 

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 ? :pt1cable:


Message édité par mrbebert le 05-03-2003 à 21:25:51
n°324047
Nico5779
Posté le 05-03-2003 à 22:27:38  profilanswer
 

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  :)  

n°324055
mrbebert
Posté le 05-03-2003 à 22:39:01  profilanswer
 

Pas de problème :)  
 
Pour distinguer les sites, tu fais comment ? Tu regardes dans le protocole HTTP :??:


Message édité par mrbebert le 05-03-2003 à 22:39:15
n°324059
Nico5779
Posté le 05-03-2003 à 22:40:05  profilanswer
 

bah vi, y as pas 36000 solutions  :)
mais si t en a d autres c avec plaisir  :ange:


Message édité par Nico5779 le 05-03-2003 à 22:41:13
n°324062
mrbebert
Posté le 05-03-2003 à 22:41:23  profilanswer
 

Certes :whistle:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  fonction bind()

 

Sujets relatifs
[PHP] --> sur quel FAI la fonction mail() est elle pas desactivée...WSAGetLastError et fonction Connect(...) pour socket
Format d'un mail avec la fonction mail()Fonction CGI qui renvoie une image
Les Masques et la fonction preg_replace [ - Job's Done - ] Merci beleg[Php] Fonction qui retourne une date X jours avant la date courante
Recherche d'un fonction semblable à eregi_replace()[MySQL] Little Question sur fonction RIGHT
C fonction malloc et realloc, je comprend pas toutAfficher page en fonction de la liste deroulante (avec une frame) ??
Plus de sujets relatifs à : fonction bind()


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)