Bonjour à tous,
Ma question est dans le titre, comment puis-je remplacer STDIN_FILENO sous windows ?
Bonjour à tous,
Ma question est dans le titre, comment puis-je remplacer STDIN_FILENO sous windows ?
Pour ça, le plus simple est de le définir toi-même:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #ifdef _WIN32 #ifndef STDIN_FILENO #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 #endif #endif
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Ok je vais tenter ça, mon but est en fait de rendre mes sockets non bloquants, j'ai vu qu'il y avait aussi la fonction WSAAsyncselect si j'ai bonne mémoire, il ne me reste plus qu'à trouver une doc !
merci.
Je souhaite réaliser un serveur multi clients et je coince un peu ...Qu'est-ce qui ne va pas avec le mode par défaut ?
Et je ne veux pas utiliser de threads.
Je bloque un peu sur l'algo de mon problème du coup car il faut que mon serveur ecoute, tout en gerant les clients déjà connectés.
Ah ? Pourquoi ?
Processus ou threads. Pas trop le choix. La solution avec select() risque d'être très complexe...Je bloque un peu sur l'algo de mon problème du coup car il faut que mon serveur ecoute, tout en gerant les clients déjà connectés.
Quoiqu'il en soit, il n'y a pas du tout besoin de passer en asynchrone...
On me l'impose, et puis si deux threads attaquent la pile en meme temps c'est la pagaille.Ah ? Pourquoi ?
Bref mon problème reste l'algorithme ...
Il y a un tutoriel sur l'utilisation des sockets non bloquants ici. L'utilisation de WSAAsyncSelect permet d'avoir un programme bien structuré (sans boucle, sans multi-threading, etc.) mais pour l'utiliser, il faut avoir créé une fenêtre (pas forcément visible ...), donc elle ne peut être proprement utilisée dans une application console à moins d'avoir deux threads : le thread principal et un autre thread pour contenir la fenêtre.
Merci a tous pour ces explications, je regarde ça apres manger
Dans ce cas présent, tous les sockets clients ont été au préalable déclarés et initialisés pour un nombre de clients definit n'est ce pas ?Non, il donnera un truc de ce genre-ci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 SOCKET server = socket(); listen(server); LISTEDECLIENTS clients; for(;;) { fd_set readfds; FD_SET(server); for all clients FD_SET(clients[i]); select(..., readfds, ...); if(FD_ISSET(server)) accept(...) for all clients if(FD_ISSET(clients[i]) recv(clients[i]); }
tableau : oui
liste chainée : non
initialisé, non. (enfin à INVALID_SOCKET, oui).et initialisés pour un nombre de clients definit n'est ce pas ?
Le nombre de clients peut être variable. Il suffit d'une structure de données souple (tableau dynamique, liste chainée ...)
ceci dit, on ne va peut être pas non plus accepter 500.000 clients en meme temps. Pour une machine donnée, il semnble que 1000 à 10000 soit le maximum (ajuster listen() en conséquence... 100, par exemple. Bien lire la doc...)...
Il ne faut pas oublier les temps de traitement et de réponses... Si c'est du html, en gros, on émet 100 à 1000 caractères pour un reçu...
Si c'est pour utiliser avec select(), laisse tomber. Ca ne fonctionnera pas. De toutes façons, il n'y a pas de descripteurs de fichiers sous Windows. C'est soit des 'handles' (SOCKET, par exemple), soit des adresses de type FILE * pour les flux.
"Tout est ficher" est un concept Unix, non repris par Windows.
Le sockets asynchrones (non-bloquants), c'est compliqué à gérer. Qu'est-ce qui ne va pas avec le mode par défaut ? Si il le faut, utilise les threads. Quel est le problème exactement ?
C'est inexact:
Sous Windows, vu du kernel, tout est "objet Kernel" (donc, vu des programmes utilisateurs, "tout est handle".
De plus, la CRT Microsoft implémente le concept de descripteurs de fichiers, en tant que surcouche par-dessus les handles (et les FILE* sont bien une surcouche par-dessus les descripteurs). Seulement, select() est faite pour marcher avec les sockets et ne supporte pas les descripteurs.
Mais même en faisant un WaitForMultipleObjects() sur le socket (ou plus précisément un WSAEVENT) et l'entrée standard, on se retrouve avec un problème dû à la façon stupide dont l'entrée standard est gérée.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager