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

  FORUM HardWare.fr
  Programmation
  C++

  socket non bloquant ????

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

socket non bloquant ????

n°434563
weed
Posté le 20-06-2003 à 19:54:13  profilanswer
 

Bonjour,  
 
je voulais juste une petite confirmation ...
le mode non connecté est il un mode connecté ....
 
J'aimerais faire un tetris a 2 et je n'aimerai pas qu'une machine attende en position d'ecoute avec un listen().
J'aimerais que les ordi puissent continuer a faire défiler les briques et qu'elle puisse ecouter en meme tps ....
 
le mode non connecté est il la solution a mon problème ou serais je obligé de me prendre la tete a faire des thread sous borland en C++ pour executer en tache de fond un listen()
http://www.commentcamarche.net/sockets/sockcomm.php3
 
Sinon que faudrait il que je fasse ???

mood
Publicité
Posté le 20-06-2003 à 19:54:13  profilanswer
 

n°434566
*syl*
--> []
Posté le 20-06-2003 à 19:57:05  profilanswer
 

Citation :

le mode non connecté est il un mode connecté ....

:lol:  
non
 
Pour ton pb, t'as qu'à utiliser des sockets non bloquant, va voir les fonctions WSAxxx sous Windows ou bien continue à utiliser les fonctions "normales" en les encapsulant dans des threads.

n°434568
Konar
Posté le 20-06-2003 à 19:59:13  profilanswer
 

le plus facile, avec 1 seul thread :
tu établis la connection avant le début de la partie.
lorsque la partie est commencée, pour savoir si des données sont ds la socket, tu utilises un select (bloquant mais avec possibilité de timer pour le quitter).
 
mais le plus logique, c'est évidemment avec 2 threads, mais ca devrait etre possible avec 1 seul...

n°434693
Kyle_Katar​n
Posté le 20-06-2003 à 22:10:00  profilanswer
 

sinon avec FD_SET, FD_ZERO et FD_ISSET, tu passes tes sockets en non bloquant à grand coup de "select" sans problèmes !

n°434710
Taz
bisounours-codeur
Posté le 20-06-2003 à 22:29:25  profilanswer
 

+ 1 pour la soluce multi-thread. tu peux meme en faire plein, ça te simplifiera aussi la programmation

n°434713
Konar
Posté le 20-06-2003 à 22:33:32  profilanswer
 

++Taz a écrit :

+ 1 pour la soluce multi-thread. tu peux meme en faire plein, ça te simplifiera aussi la programmation


 
mouais...
 
j'aurais dit ca aussi d'habitude, mais la ca fait bien 8h ke je bloque sur un pb de deadlock dans un serveur, qui comprend juste 5 threads. Le code est a moitié a moi alors ca m'aide pas non plus à trouver l'origine du bug.
 
trop de critical sections, c'est tout ce que j'ai a dire...

n°434728
weed
Posté le 20-06-2003 à 22:47:01  profilanswer
 

petite remarque je programme sous borland5 en c++ sous windows, je veux bien des trucs portable uniquement sous windows ...  
 
le top serait en effet de faire un thread qui s'occupe du listen() ms j'ai jms programme un thread je sais pas si c compliqué  
 
j'ai vu sur internet qu'il y avait les fonctions WSAAsyncSelect(),WSAAsyncGetHostByAddr(), WSAAsyncGetHostByName(), WSAAsyncGetProtoByNumber() qui permettrait de faire des socket asynchrones (pour faire des socket ds les 2 sens). Qu'est que vous en pensez ???  
 
sinon y a ca :
ioctlsocket(sd, FIONBIO, &argp);
je crois que cela permet de rendre une socket non bloquant...
ms je comprends pas trop car c'est au niveau du listen vu le code source :
 

Code :
  1. bool non_bloquante(SOCKET sd) {
  2.    u_long argp=1;
  3.    ioctlsocket(sd, FIONBIO, &argp);
  4.    if (argp==0) {
  5.       fprintf(stderr, "socket non-bloquante, deuxième tentative\n" );
  6.       ioctlsocket(sd, FIONBIO, &argp);
  7.    }
  8.    if (argp==0) {
  9.       fprintf(stderr, "n'arrive pas à créer une socket non-bloquante\n" );
  10.       return false;
  11.    }
  12.    return true;
  13. }
  14. Le code typique est le suivant:
  15. while (ret=recv(sd, temp, TEMP_LEN, 0)) {
  16.    if (ret==SOCKET_ERROR) {
  17.       if (WSAGetLastError()!=WSAEWOULDBLOCK) {
  18.          fprintf(stderr, "une erreur est survenue\n" );
  19.          break;
  20.       } else fprintf(stdout, "." );
  21.    } else while(--ret<0) fprintf(stdout, "#" );
  22. }


 
sinon le select() permettrait de connaitre l'état de la socket, ms ca veut dire quoi ca justemment ??????  
je comprends pas trop la remarque de Kyle_Katarn qui me dit que le select me permettrait de passait en non bloquant alors que c'est juste pour etre informé de l'état le select()
 
pour vous quel serait la methode la plus simple que vous avez tester ????


Message édité par weed le 20-06-2003 à 22:51:54
n°434742
Konar
Posté le 20-06-2003 à 22:55:16  profilanswer
 

weed a écrit :


sinon le select() de connaitre l'état de la socket, ms ca veut dire quoi ca justemment ??????  
je comprends pas trop la remarque de Kyle_Katarn qui me dit que le select me permettrait de passait en non bloquant
 


 
select te permet effectivement de connaitre "l'etat" d'une ou plusieurs sockets. cette fct n'est pas bloquante si tu lui passes un timeout (par ex de 50 ms), car si au bout de ces 50 ms rien ne s'est passé, elle retourne 0 ce qui te permet de traiter d'autre données. par contre si une socket contient des données, le select retourne sans attendre les 50 ms.
 
donc ca serait possible de mettre tout le bordel dans 1 seul thread, de cette manière :

Code :
  1. while ()
  2. {
  3.   int ret = select(); // pour voir si y a des données ds la socket
  4.   if (données ds une socket)
  5.     recv()
  6.    
  7.   // autre code (par ex affichage)
  8. }


 
la seule condition étant de passer par le select un minimum de fois par seconde.
 
a mon avis c'est pas la meilleure solution, mais ptet la plus simple si t'as vraiment pas envie de faire des freds.
 
edit : petite précision, les sockets sont ici bloquantes mais aucune fct n'est bloquante donc le pb se pose pas.


Message édité par Konar le 20-06-2003 à 22:56:53
n°434932
Kyle_Katar​n
Posté le 21-06-2003 à 10:09:13  profilanswer
 

Voilà un morceau de code du serveur SMTP que j'ai codé :  
 

Code :
  1. while ((nRet != SOCKET_ERROR) && (msg->Find("\n",0)==-1))
  2. {
  3.  FD_ZERO(&rd);
  4.  FD_SET(sck,&rd);
  5.  select(sck+1,&rd,(fd_set *) 0, (fd_set *) 0,&t);
  6.  if (FD_ISSET(sck, &rd))
  7.  {
  8.   nRet=recv(sck,buf.GetBuffer(255),255,0);
  9.   buf.ReleaseBuffer();
  10.   if ((nRet != SOCKET_ERROR) && (nRet!=0))
  11.    (*msg)+=buf.Left(nRet);
  12.   else
  13.    return false;
  14.  }
  15.  else
  16.  {
  17.   return false;
  18.  }
  19.  buf.Empty();
  20.  if (b_exit) return false;
  21. }


 
J'espère que ça explique clairement l'usage des FD_ISSET et autres...

n°435052
xWillow
Posté le 21-06-2003 à 13:13:20  profilanswer
 

oui, il faut un seul thread, et utiliser select
comme select te dit s'il y a des infos a lire, le recv ne bloque pas.

mood
Publicité
Posté le 21-06-2003 à 13:13:20  profilanswer
 

n°435053
Kyle_Katar​n
Posté le 21-06-2003 à 13:16:29  profilanswer
 

bien sûr le multithreading marche aussi mais c'est une solution de facilité qui est généralement mal employée par ceux qui l'utilisent.

n°437534
weed
Posté le 24-06-2003 à 00:35:31  profilanswer
 

c kler de chez clair que ca serait le top  
j'ai trouvé 2-3 truc nottamment sur la msdn  
http://www.microsoft.com/belux/fr/ [...] read1.mspx
et ca  
http://www.flipcode.com/tutorials/tut_mthreading.shtml
 
j'ai pas trop regardé a ce qui parait y a plein de poonteurs chose que j'aime pas trop ....
 
j'ai vu aussi je ne sais plus ou un tuto thread, mais j'ai vu qu'il y avait un fork. et le fork ca permet de dupliquer un processus et de savoir si on est le pere ou le fils par le PID qu'il retourne... Dc c tottallement different C et C++ j'ai l'impression .....
 
J'en ai jms fait c compliqué ou pas ????
et surtout si vous pour moi des exemples le plus basics possibles pour expliquer
 
sinon si je n'y arrive je ferais un petit select () ms ca ferait plaisir de savoir creer un thread ms bon si ca me prends trop de tps je laisserai tomber.  

n°437567
Konar
Posté le 24-06-2003 à 01:41:11  profilanswer
 

exemple a la con :
 

Code :
  1. #include <windows.h>
  2. DWORD WINAPI Thread_Rien(LPVOID lpParameter)
  3. {
  4. int i = (int)lpParameter;
  5. while (i--)
  6. {
  7.  MessageBox(0, "Thread", "", 0);
  8.  Sleep(1000);
  9. }
  10. return 1;
  11. }
  12. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  13. {
  14. DWORD dwThreadId;
  15. HANDLE hThread = CreateThread(NULL, 0, Thread_Rien, (LPVOID)10, 0, &dwThreadId);
  16. DWORD dw = WaitForSingleObject(hThread, 5000);
  17. if (dw == WAIT_TIMEOUT)
  18.  TerminateThread(hThread, 0);
  19. return 0;
  20. }


 
lis vite fait la doc sur les fct CreateThread, WaitForSingleObject et GetExitCodeThread, et tu devrais vite voir le principe du bordel.

n°437572
weed
Posté le 24-06-2003 à 02:02:51  profilanswer
 

humm hulll oki  
 
j'ai pas encore fini mon tetris en solo, ma class file_d'attente et oui je pourrais faire tomber plusieurs brique en meme tps et 2-3 trucs et apres je me jette sur les threads ....
 
et je ferais remonté le topic si je 2-3 questions sur les threads  
 
oki pour WaitForSignalObject()

Citation :

L'événement signalé
// ===================
//
// c'est un mécanisme permettant de réaliser une attente passive (i.e. sans
// utiliser de temps sur le processeur). Tout comme pour la section critique,
// il s'agit d'un objet spécialisé optimisé pour attendre d'être signalé,
// comportement que l'on pourrait obtenir là aussi avec une sémaphore.
//
// utilisation typique :
// une tâche T1 réalise un travail puis signal S
// une tâche T2 attend S puis réalise un travail
//
// création du signal par CreateEvent()
// suppression du signal par CloseHandle()
// attente du signal par WaitForSingleObject()
// envoie du signal par SetEvent()
//
// notez qu'une tache se terminant, elle signale son état, ce qui permet
// à une autre tache éventuellement en attente avec WaitForSignalObject()
// de poursuivre son exécution


http://perso.wanadoo.fr/dgil/ftp/coiffeur_cpp.txt
 
 
GetExitCodeThread,  
The GetExitCodeThread function retrieves the termination status of the specified thread.
ca permet de recuperer le thread qd il est terminé ou pas, c quoi ce termination ....
http://msdn.microsoft.com/library/ [...] thread.asp
 
 
bon j'y regarderé plus tard sur les thread qd mon programmes sera oki ...

n°438265
blackgodde​ss
vive le troll !
Posté le 24-06-2003 à 17:08:20  profilanswer
 

Kyle_Katarn :
J'espère que ça explique clairement l'usage des FD_ISSET et autres...
 
bin ... pour moi c'est pas clair du tout ... tu aurais un tit tuto/cours la dessus ?


---------------
-( BlackGoddess )-
n°438280
nraynaud
lol
Posté le 24-06-2003 à 17:25:03  profilanswer
 

Konar a écrit :


j'aurais dit ca aussi d'habitude, mais la ca fait bien 8h ke je bloque sur un pb de deadlock dans un serveur, qui comprend juste 5 threads. Le code est a moitié a moi alors ca m'aide pas non plus à trouver l'origine du bug.
 
trop de critical sections, c'est tout ce que j'ai a dire...


Langage de spécification formel et preuve -> utiliser les outils adaptés au problème ....

n°438290
Kyle_Katar​n
Posté le 24-06-2003 à 17:32:07  profilanswer
 

BlackGoddess a écrit :

Kyle_Katarn :
J'espère que ça explique clairement l'usage des FD_ISSET et autres...
 
bin ... pour moi c'est pas clair du tout ... tu aurais un tit tuto/cours la dessus ?


 
Non mais le MSDN l'explique assez clairement il me semble.
Avec un pote on a monté tout un serveur SMTP qui tiend bien (plusieurs centaines de réception et envois simultannéements multithreadés) avec uniquement ça. Donc si on l'a fait ça doit pas être trop dur de comprendre.... (au pire je peux te filer les bout de code nécessaires)

n°438329
Konar
Posté le 24-06-2003 à 17:56:17  profilanswer
 

nraynaud a écrit :


Langage de spécification formel et preuve -> utiliser les outils adaptés au problème ....


 
moui... tu pourrais donner plus de précisions ???
 
pasque la j'ai temporairement résolu le pb du deadlock en virant la plupart des critical sections, je fais pour le moment confiance au "Thread Safety in the Standard C++ Library".

n°438376
nraynaud
lol
Posté le 24-06-2003 à 18:17:24  profilanswer
 

Konar a écrit :


moui... tu pourrais donner plus de précisions ???


Non, c'est pas mon domaine, c'est en général dans le domaine du temps-réel. Tu vires la partie qui t'intéresse pas et tu garde la partie multi-processus et synchro. Je me souviens plus du nom du moindre langage, ni outil de preuve, et je m'en porte plutôt bien.

n°438389
Konar
Posté le 24-06-2003 à 18:28:15  profilanswer
 

nraynaud a écrit :


Non, c'est pas mon domaine, c'est en général dans le domaine du temps-réel. Tu vires la partie qui t'intéresse pas et tu garde la partie multi-processus et synchro. Je me souviens plus du nom du moindre langage, ni outil de preuve, et je m'en porte plutôt bien.  


 
me demande si on parle de la meme chose la...
 
j'ai une appli C++ avec plein de threads, qui peuvent éventuellement utiliser (lecture et/ou écriture) les mêmes objets. Je vais pas virer le code comme ca... ca marchera surement moins bien.
 
enfin bon c'est pas critique comme pb, la stl a l'air de claker a ce niveau.

n°438526
nraynaud
lol
Posté le 24-06-2003 à 22:35:16  profilanswer
 

Konar a écrit :


Je vais pas virer le code comme ca... ca marchera surement moins bien.


Je te parle de virer la partie qui t'intéresse pas dans la théorie du temps-réel.

n°438615
Konar
Posté le 25-06-2003 à 01:32:30  profilanswer
 

nraynaud a écrit :


Je te parle de virer la partie qui t'intéresse pas dans la théorie du temps-réel.


 
bah vais faire ca, t'as raison.
apres je compilerais en mode théorie temps réél.

mood
Publicité
Posté le   profilanswer
 


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

  socket non bloquant ????

 

Sujets relatifs
raw_socket sous win 2000/xp[C] Aide sur les Socket
socket Close ( est - ce normal ? )[ java ] transfert de fichiers dans un socket
[C] socket / file des.relais brisé (socket)
[C] Socket UDP connaitre le port source ???[C++] Socket UDP - Pb Reception du datagramme
[socket] en lecture ou écriture seule[socket TCP] gestion de la deconnexion d1 client telnet
Plus de sujets relatifs à : socket non bloquant ????


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR