Probléme Socket

Probléme Socket - C - Programmation

Marsh Posté le 08-04-2009 à 14:01:13    

Bonjour a tous,
voici mon petit programme Serveur UDP:

Code :
  1. #include<stdio.h>
  2. #include<signal.h>
  3. #include<sys/time.h>
  4. #include<sys/socket.h>
  5. #include<sys/types.h>
  6. #include<netinet/in.h>
  7. #include<netdb.h>
  8. #define PORTS 6260 //port serveur
  9. main()
  10. {
  11. struct sockaddr_in sin_serv;  // structure pr le serveur
  12. struct sockaddr_in sin_clien; // structeur pr le client
  13. int namelen, sock;
  14. int pid, statut,n,i,lg;
  15. char line[100];
  16. if(sock_serv=sock(AF_INET, SOCK_DGRAM, IPPROTO_UDP)<0)
  17. {
  18.  perror("socket" );
  19.  exit(1);
  20. }
  21. bzero(&sin_serv,sizeof(sin));
  22. sin_serv.sin_family=AF_INET;
  23. sin_serv.sin_port=htons(PORTS);
  24. sin_serv.sin_addr.s_addr=INADDR_ANY;
  25. if(bind(sin_serv,&sin_serv,sizeof(sin_serv))<0)
  26. {
  27.  perror("bind" );
  28.  exit(2);
  29. }
  30. /************ Reçevoir le message **************/
  31. n=recvfrom(sock_serv,line,strlen(line),0,&sin_clien,sizeof(sin_clien));
  32. printf("me message %s est bien recu sa longueur est: %d", line,strlen(line));
  33. return;
  34. }


 
sous windows: aucune erreur et il s'éxécute trés bien.
sous Linux(Ubuntu): aucune erreur MAIS lorsque je l'exécute il m'affiche une erreur: bind:Socket operation on non-socket! pourquoi cette erreur? et sa veux dire quoi? Merci


Message édité par man_u le 08-04-2009 à 14:02:54
Reply

Marsh Posté le 08-04-2009 à 14:01:13   

Reply

Marsh Posté le 08-04-2009 à 16:01:02    

Au lieu de :

if(bind(sin_serv,&sin_serv,sizeof(sin_serv))<0)

Essayer :

if(bind(sock_serv,&sin_serv,sizeof(sin_serv))<0)

Reply

Marsh Posté le 08-04-2009 à 17:06:23    

Merci olivhill mais le probléme reste tjr le meme, voici le nouveau:

Code :
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<signal.h>
  4. #include<sys/time.h>
  5. #include<sys/socket.h>
  6. #include<sys/types.h>
  7. #include<netinet/in.h>
  8. #include<netdb.h>
  9. #define PORTS 6260 //port serveur
  10. int main(void)
  11. {
  12. struct sockaddr_in sin_serv;  // structure pr le serveur
  13. struct sockaddr_in sin_clien; // structeur pr le client
  14. int namelen, sock_serv;
  15. int pid, statut,n,i,lg;
  16. char line[100];
  17. if(sock_serv=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)<0)
  18. {
  19.  perror("socket" );
  20.  return 0;
  21. }
  22. bzero(&sin_serv,sizeof(sin_serv));
  23. sin_serv.sin_family=AF_INET;
  24. sin_serv.sin_port=htons(PORTS);
  25. sin_serv.sin_addr.s_addr=INADDR_ANY;
  26. if(bind(sock_serv,(struct sockaddr *)&sin_serv,sizeof(sin_serv))<0)
  27. {
  28.  perror("bind" );
  29.  return 0;
  30. }
  31. /************ Reçevoir le message **************/
  32. int size_sin_clien=sizeof(sin_clien);
  33. n=recvfrom(sock_serv,line,strlen(line),0,(struct sockaddr *)&sin_clien,&size_sin_clien);
  34. printf("me message %s est bien recu sa longueur est: %d", line,strlen(line));
  35. return 1;
  36. }


pourquoi sa ne marche pas?!  :(

Reply

Marsh Posté le 08-04-2009 à 17:20:35    

Est-ce que le message reste exactement le même (bind:Socket operation on non-socket! ) ou bien est-ce que le programme va un peu plus loin ?
 
J'ai un programme un peu similiare, mais au lieu de

sin_serv.sin_addr.s_addr=INADDR_ANY;

j'ai  

sin_serv.sin_addr.s_addr = inet_addr(ip_addr); // e.g. inet_addr("123.10.20.30" )


Et plus bas, la ligne du recvfrom ne me semble pas correcte. J'essayerais plutôt :
n=recvfrom(sock_serv,line,sizeof(line),0,(struct sockaddr *)&sin_clien,&size_sin_clien);

Reply

Marsh Posté le 08-04-2009 à 22:59:30    

non non le programme et comme sa mais il m'affiche toujours la meme chose :( !

Reply

Marsh Posté le 09-04-2009 à 09:25:49    

Peut-être que la modification n'a pas été prise en compte. Il faudrait mettre des traces pour voir si c'est la nouvelle version qui tourne. Et peut-être qu'au lieu d'écouter sur toutes les adresses, il faudrait écouter sur une adresse particulière, au moins pour réussir à faire tourner une première version.

Reply

Marsh Posté le 10-04-2009 à 17:06:43    

Ton problème viens de cette ligne:

Code :
  1. if( sock_serv=socket(AF_INET, SOCK_DGRAM, 0) <0)


tu utilises une affectation et une comparaison dans la même condition du if donc il faut entourer ton affectation par des parenthaises comme suite:

Code :
  1. if( (sock_serv=socket(AF_INET, SOCK_DGRAM, 0)) <0)


ça devrait régler ton problème au niveau du bind.

 

Au passage, quelque remarques à part:
- Pour la fonction main en langage C, on retourne 0 quand c'est succès, et dans le cas d'échec on retourne 1, et non pas le contraire comme tu as fait dans ton code.
- Au niveau du recvfrom, utilise sizeof(line) pas strlen(line). recvfrom ne peut pas connaitre strlen(line) avant de recevoir line ...
- En mode texte, le '\0' de fin de chaine n'est pas transmis, il faut le faire donc: line[n] = 0; et au niveau de recvfrom tu dois prévoir de la place pour ce caractère (le 0), donc sizeof(line)-1

 

à lire absolument: http://mapage.noos.fr/emdel/reseaux.htm

 

---------------
JMCT


Message édité par tomap le 10-04-2009 à 22:19:22
Reply

Marsh Posté le 10-04-2009 à 22:04:53    

Oui ça marche ! Merci tomap et olivthill !
tomap sa ve dire quoi JMCT? lol

Reply

Marsh Posté le 10-04-2009 à 22:09:57    

man_u a écrit :

Oui ça marche ! Merci tomap et olivthill !


De rien.

man_u a écrit :

tomap sa ve dire quoi JMCT? lol


<HS>
ça veux dire "Je M'en Carre Totalement" (google pour plus d'infos..), c'est pour que tu me reconnaisse, parce que je t'ai reconnu moi :D
</HS>


Message édité par tomap le 10-04-2009 à 22:24:48
Reply

Marsh Posté le 10-04-2009 à 22:10:46    

;)

Reply

Sujets relatifs:

Leave a Replay

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