[C/C++]comment savoir si un port UDP et ouvert sur une machine ?

comment savoir si un port UDP et ouvert sur une machine ? [C/C++] - C++ - Programmation

Marsh Posté le 23-04-2003 à 17:26:29    

Salut a tous,
voila j'aurais voulu savoir s'il est possbile de savoir si un port UDP est ouvert sur une machine.Car en UDP il n'y a pas de connection ...
 
s=sendto(c, buf, sizeof(buf), 0, (LPSOCKADDR)&to, sizeof(to));
if(s == 0 || s == SOCKET_ERROR)
printf("erreur" );
 
ke le port soi ouvert ou non le je n'ai jamais erreur dans la console.
 
quelqu'un a une idée ?,merci

Reply

Marsh Posté le 23-04-2003 à 17:26:29   

Reply

Marsh Posté le 23-04-2003 à 18:39:06    

bah en fait, c l'un des interets de l'UDP: qu'il y ait quelqu'un ou pas à l'autre bout, l'emeteur n'est pas affecté (ne recoit pas d'erreur)
 
pour savoir si le destinataire recoit qq chose, il doit te renvoyer explicitement une info pour te le dire.

Reply

Marsh Posté le 23-04-2003 à 19:55:31    

ouaip ben c 'est bien ce ki é con
car pour recevoir un message c la commande recvfrom et elle reste bloké tant k'il n'y a pas de message !
 
car moi enfaite g une liste d'ip et je doit regarder tte les 20 seconde s'il le port 1002 en UDP et ouvert, pour sela je leur send ping et les ip en question doivent me repondre pong, mais si il y a une ip ou le port 1002 est pas ouvert je pong je pe tjr l'attendre est donc paff mon programme est bloké !

Reply

Marsh Posté le 24-04-2003 à 00:31:34    

tu peux t'en sortir grace à la fonction select() qui accepte un timeout. pour en savoir plus, ya un ancien post concernant le tcp/ip non-bloquant (valable aussi pour l'udp)
 
"TCP-IP Pb recv bloquant et terminaison de processus" initié par xilebo


Message édité par Deaddy le 24-04-2003 à 00:33:58
Reply

Marsh Posté le 24-04-2003 à 09:49:19    

dsl mais j'ai absolument rien capter au post de xilebo !
 
je cherche un truc simple moi :)
 

Code :
  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #include <windows.h>
  4. #pragma comment(lib, "ws2_32.lib" )
  5. void main(void)
  6. {
  7. SOCKET c;
  8. SOCKADDR_IN to;
  9. WSADATA wsa;
  10. WORD v;
  11. int sizePeerAddr = sizeof(to);
  12. char ip[50];
  13. char buf[] = "ping";
  14. char rec[1024];
  15. int r,s;
  16. //Socket//
  17. v = MAKEWORD(2, 0);
  18. if(WSAStartup(v, &wsa) != 0)
  19. exit(EXIT_FAILURE);
  20. ///////////////////////
  21. do
  22. {
  23. scanf("%s",ip);
  24. c = socket(AF_INET, SOCK_DGRAM, 0);
  25. to.sin_family = AF_INET;
  26. to.sin_addr.s_addr = inet_addr(ip);
  27. to.sin_port = htons(1002);
  28. s= sendto(c, buf, sizeof(buf), 0, (LPSOCKADDR)&to, sizeof(to));
  29. if(s == 0 || s == SOCKET_ERROR) printf("pas de connection\n" );
  30. if(s > 0) printf("message envoye avec succes\n" );
  31. r = recvfrom(c, rec, sizeof(rec), 0, (LPSOCKADDR)&to, &sizePeerAddr);
  32. if(r == 0 || r == SOCKET_ERROR) printf("pas de connection\n" );
  33. if(r > 0) printf("message recu avec succes\n" );
  34. closesocket(c);
  35. } while (1);
  36. WSACleanup();
  37. }


 
avec ce source la comment je fais pour inséré un timeout au recvfrom ?
 
merci !

Reply

Marsh Posté le 24-04-2003 à 14:42:33    

:bounce: please

Reply

Marsh Posté le 25-04-2003 à 00:55:42    

Code :
  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #include <windows.h>
  4. #pragma comment(lib, "wsock32.lib" )
  5. void main(void)
  6. {
  7. SOCKET c;
  8. SOCKADDR_IN to,here;
  9. WSADATA wsa;
  10. WORD v;
  11. int sizePeerAddr = sizeof(to);
  12. char ip[50];
  13. char buf[] = "ping";
  14. char rec[1024];
  15. int r,s;
  16. fd_set f;
  17. struct timeval ti;
  18. /*Socket*/
  19. v = MAKEWORD(2, 0);
  20. if(WSAStartup(v, &wsa) != 0) exit(EXIT_FAILURE);
  21. c = socket(AF_INET, SOCK_DGRAM, 0);
  22. here.sin_addr.s_addr=INADDR_ANY;
  23. here.sin_port=htons(/*a toi de voir*/);
  24. here.sin_family=to.sin_family = AF_INET;
  25. to.sin_port = htons(1002);
  26. if (bind(s,(sockaddr*)&here,sizeof(here))<0) { perror("bind" );exit(-1);}
  27. ti.tv_sec=1; // 1 seconde
  28. do
  29. {
  30.  scanf("%s",ip);
  31.  to.sin_addr.s_addr = inet_addr(ip);
  32.  s= sendto(c, buf, sizeof(buf), 0, (LPSOCKADDR)&to, sizeof(to));
  33.  printf("%d octets envoyés\n",s);
  34.  FD_ZERO(&f);
  35.  FD_SET(c,&f);
  36.  if (select(FD_SETSIZE,&f,NULL,NULL,&ti))
  37.  {
  38.   r = recvfrom(c, rec, sizeof(rec), 0, (LPSOCKADDR)&to, &sizePeerAddr);
  39.   printf("%d octets recus\n",r);
  40.  }
  41.  else pritnf("TIMEOUT\n" );
  42. } while (1);
  43. closesocket(c);
  44. WSACleanup();
  45. }

 
 
(j'ai rien testé)

Reply

Marsh Posté le 25-04-2003 à 12:48:14    

CtHuLhU50 a écrit :


car pour recevoir un message c la commande recvfrom et elle reste bloké tant k'il n'y a pas de message !


 
Utilise un thread auxiliaire

Reply

Marsh Posté le 26-04-2003 à 23:41:07    

comment k'on fé un thread auxiliaire :) !

Reply

Marsh Posté le 27-04-2003 à 14:42:41    

Tu utilises la fonction CreateThread  ( tu sais ce que c'est un thread au fait? ) dont le mode d'emploi est détaillé dans la msdn

Reply

Marsh Posté le 27-04-2003 à 14:42:41   

Reply

Marsh Posté le 30-04-2003 à 11:49:00    

http://www.manualy.sk/sock-faq/unix-socket-faq-6.html
pour faire une socket non bloquante
 
c'est pour unix mais la fonction marche pareil que sous windows


Message édité par xWillow le 30-04-2003 à 11:49:47
Reply

Sujets relatifs:

Leave a Replay

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