fonction bind()

fonction bind() - C++ - Programmation

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 :

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
Reply

Marsh Posté le 04-03-2003 à 03:07:06   

Reply

Marsh Posté le 04-03-2003 à 07:16:37    

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.

Reply

Marsh Posté le 04-03-2003 à 11:23:41    

:whistle:  
 
MERCI!!
 :D

Reply

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?

Reply

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.

Reply

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

Marsh Posté le 04-03-2003 à 18:27:39    

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"


Reply

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

Reply

Marsh Posté le 04-03-2003 à 21:46:59    

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
Reply

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

Reply

Marsh Posté le 04-03-2003 à 22:13:28   

Reply

Marsh Posté le 04-03-2003 à 22:29:45    

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.

Reply

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.
 
 

Reply

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.

Reply

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 :


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
Reply

Marsh Posté le 05-03-2003 à 20:56:23    

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
Reply

Marsh Posté le 05-03-2003 à 20:57:51    

vi je recois bien tout.

Reply

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.

Reply

Marsh Posté le 05-03-2003 à 21:04:23    

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

Reply

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.


Message édité par mrbebert le 05-03-2003 à 21:07:23
Reply

Marsh Posté le 05-03-2003 à 21:08:56    

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

Reply

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?

Reply

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


Message édité par mrbebert le 05-03-2003 à 21:25:51
Reply

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

Reply

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


Message édité par mrbebert le 05-03-2003 à 22:39:15
Reply

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


Message édité par Nico5779 le 05-03-2003 à 22:41:13
Reply

Marsh Posté le 05-03-2003 à 22:41:23    

Certes :whistle:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed