J'ai trouvé !
Le socket plante en envoyant un sf::Packet de 8964o.
J'ai diminué le nombre de case de map chargée a la fois (par socket, de 500 et 100), la vitesse est considérablement réduite, je passe de 7s a 40s pour une map de 500*500, la vitesse de chargement passe de 21000cases/s (450 - 500ko/s env) a 6000cases/s (116ko/s)
Je ne sais pas si on peut considérer que 8ko c'est beaucoup sur un socket, parce que plus j'envoie de données d'un coup dans un socket et plus ça se charge vite, et encore, je suis sur réseau local et je ne vais qu'as 500ko/s (avec des socket de 8ko maximum) alors que j'ai un débit maximal de 12.6mo/s, donc monter a 1 ou 2mo ne devrait normalement pas être un problème.
Maintenant, le problème n'est pas partout, donc le bug a l'air de venir des sf::Packet au transfert, mais sur certains ordis ça fonctionne, sur d'autres ça bloque.
Personnellement, j'ai déjà eut des blocages en UDP aussi, je suis obligé de limite faire lagguer le jeu en réseau en mettant les fréquences de rafraîchissement des positions des jours très basse alors que je n'envoie pas grand chose en UDP pour la position des persos, sinon le socket se bloque définitivement.
Quand je vois les autres jeux ce qu'ils peuvent envoyer je me dis que c'est pas trop normal...
Et le http par exemple, ça ne bloque pas sous prétexte que l'on télécharge a plus de 150ko/s (c'est un exemple, mais ça montre que si on arrive a atteindre des débits plus élevés sur le réseau sans bugguer ailleurs c'est que la SFML doit avoir un bug...quelque part..)
Notez que je fais bien attention a ne pas envoyer plusieurs sockets a la fois, c'est a dire que je regroupe tout ce que j'ai besoin d'envoyer a un client dans une variable et j'envoie tout a la fin de l'image, donc ça limite le nombre de socket (y compris en UDP), et pour le chargement de la map (TCP), j'attends une réponse du client indiquant qu'il a bien chargé ce que je lui ai envoyé pour lui envoyer la suite, je n'envoie pas tout d'un coup n'importe comment...
Si ça peut vous aider, voici le PC capable de faire serveur et donc d'envoyer les données, mais pour lequel ça bloque directement si il reçois un socket de 8ko (parfois beaucoup moins..).
Le PC est récent, il date de fin 2009 début 2010:
Il tourne sous Ubuntu 12.04 LTS 64bits (je n'utilises que Linux personnellement, et très rarement Windows..)
Et voici donc le résultat de la commande lspci histoire que vous aillez le détail matériel, par exemple la carte réseau ou autres si ça peut vous servir:
00:00.0 RAM memory: NVIDIA Corporation MCP78S [GeForce 8200] Memory Controller (rev a2)
00:01.0 ISA bridge: NVIDIA Corporation MCP78S [GeForce 8200] LPC Bridge (rev a2)
00:01.1 SMBus: NVIDIA Corporation MCP78S [GeForce 8200] SMBus (rev a1)
00:01.2 RAM memory: NVIDIA Corporation MCP78S [GeForce 8200] Memory Controller (rev a1)
00:01.3 Co-processor: NVIDIA Corporation MCP78S [GeForce 8200] Co-Processor (rev a2)
00:01.4 RAM memory: NVIDIA Corporation MCP78S [GeForce 8200] Memory Controller (rev a1)
00:02.0 USB controller: NVIDIA Corporation MCP78S [GeForce 8200] OHCI USB 1.1 Controller (rev a1)
00:02.1 USB controller: NVIDIA Corporation MCP78S [GeForce 8200] EHCI USB 2.0 Controller (rev a1)
00:04.0 USB controller: NVIDIA Corporation MCP78S [GeForce 8200] OHCI USB 1.1 Controller (rev a1)
00:04.1 USB controller: NVIDIA Corporation MCP78S [GeForce 8200] EHCI USB 2.0 Controller (rev a1)
00:06.0 IDE interface: NVIDIA Corporation MCP78S [GeForce 8200] IDE (rev a1)
00:07.0 Audio device: NVIDIA Corporation MCP72XE/MCP72P/MCP78U/MCP78S High Definition Audio (rev a1)
00:08.0 PCI bridge: NVIDIA Corporation MCP78S [GeForce 8200] PCI Bridge (rev a1)
00:09.0 SATA controller: NVIDIA Corporation MCP78S [GeForce 8200] AHCI Controller (rev a2)
00:0a.0 Ethernet controller: NVIDIA Corporation MCP77 Ethernet (rev a2)
00:10.0 PCI bridge: NVIDIA Corporation MCP78S [GeForce 8200] PCI Express Bridge (rev a1)
00:12.0 PCI bridge: NVIDIA Corporation MCP78S [GeForce 8200] PCI Express Bridge (rev a1)
00:13.0 PCI bridge: NVIDIA Corporation MCP78S [GeForce 8200] PCI Bridge (rev a1)
00:18.0 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor HyperTransport Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Miscellaneous Control
00:18.4 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Link Control
02:00.0 VGA compatible controller: NVIDIA Corporation GT216 [GeForce GT 220] (rev a2)
02:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)
04:00.0 FireWire (IEEE 1394): VIA Technologies, Inc. VT6315 Series Firewire Controller
Et le PC pour lequel je n'ai pas eut de problème avec les socket de 8ko, par contre j'ai déjà eut aussi des socket bloqués donc ça arrive aussi dessus, en UDP et a d'autres moment dans le jeu (ça dépends des fois..):
Le PC est aussi récent, il date de mi 2011: (je ne rapporte pas de bugs pour des vielles machines ça n'aurait pas de sens
)
Il tourne aussi sous Ubuntu 12.04 LTS 64bits
00:00.0 Host bridge: Intel Corporation Core Processor DRAM Controller (rev 18)
00:01.0 PCI bridge: Intel Corporation Core Processor PCI Express x16 Root Port (rev 18)
00:1a.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 06)
00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 06)
00:1c.0 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 1 (rev 06)
00:1c.2 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 3 (rev 06)
00:1d.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 06)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev a6)
00:1f.0 ISA bridge: Intel Corporation 5 Series Chipset LPC Interface Controller (rev 06)
00:1f.2 RAID bus controller: Intel Corporation 82801 SATA Controller [RAID mode] (rev 06)
00:1f.3 SMBus: Intel Corporation 5 Series/3400 Series Chipset SMBus Controller (rev 06)
01:00.0 VGA compatible controller: NVIDIA Corporation Device 0dc0 (rev a1)
01:00.1 Audio device: NVIDIA Corporation GF106 High Definition Audio Controller (rev a1)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)
ff:00.0 Host bridge: Intel Corporation Core Processor QuickPath Architecture Generic Non-core Registers (rev 05)
ff:00.1 Host bridge: Intel Corporation Core Processor QuickPath Architecture System Address Decoder (rev 05)
ff:02.0 Host bridge: Intel Corporation Core Processor QPI Link 0 (rev 05)
ff:02.1 Host bridge: Intel Corporation Core Processor QPI Physical 0 (rev 05)
ff:02.2 Host bridge: Intel Corporation Core Processor Reserved (rev 05)
ff:02.3 Host bridge: Intel Corporation Core Processor Reserved (rev 05)
Voilà, a mon avis le problème viens des sf::Packet qui bien que hyper pratique, ont un problème pour transférer plus de données.
Je ne crois pas avoir déjà eut ce problème avant quand le jeu ne les utilisait pas (il utilisait les chaines standard), par contre le jeu ramait avec les chaines standard qui envoyaient des caractères vides a tout bout de champs, et j'avais d'autres problèmes du a la limite de caractères qui était fixe.
Si je me rappelle bien, quand j'utilisais encode beaucoup Game Develop (il y a environ 1an ou 1an et demi) pour créer mes jeux en 2D (c'est comme ça que j'ai connu la SFML et c'est aussi pour ça que la SFML est la première bibliothèque que j'ai appris a utiliser quand j'ai commencé a programmer en C++), j'avais crée un jeu type TPS pour tester un truc, et j'avais déjà ce bug le jeu n'arrivait plus a recevoir de données, et du au logiciel (GD) ou pas, le jeu freezait même des fois après qu'il ne puisse plus recevoir de données....bon, le freeze ne doit pas venir de la SFML puisque je n'ai pas rencontré ce problème en C++...
Voilà, la SFML 2.0 est en RC ça tombe bien, si vous trouvez ce fameux bug dans les socket ça fera une version 2.0 parfaitement stable
Merci
PS: J'utilisais Game Develop sous Windows 7 64bits, et j'ai eu le problème avec le premier PC dont j'ai parlé qui testait le jeu avec Wine (Ubuntu 10.04 LTS 64bits), 3 autres PC portables (Ordis avec lesquels j'ai testé le jeu) qui étaient sous Windows 7 64bits et une tour un peu plus ancienne (5 - 6ans) sous Windows Xp 32bits.
J'avais pris soin de faire plusieurs tests même en ne mettant que des PC's portables sous Windows 7 64bits etc pour supprimer les possibles bugs de Wine, et le jeu n'as jamais marché correctement, toujours un moment ou un joueur ne recevait plus rien, si c'était pas plusieurs joueurs....
PS2: J'ai aussi en C++ testé 2 versions de mon serveur, une version graphique, qui affiche tout ce qui se passe sur le serveur en graphique, et une version console (terminal) qui fonctionne de la même façon sans faire les calculs graphiques (en supposant que ça aurait pu ralentir le trafic a cause des calculs), et j'obtiens le même résultat, hors mis que la version terminal consomme évidement beaucoup moins de ressources sur l'ordi.
PS3: J'ai déjà bossé un maximum sur l'optimisation du jeu, et a chaque fois ça se bloquait sur les socket, quel que soit l'optimisation, aujourd'hui le jeu a un algorithme pour charger dynamiquement les maps sur les clients (en temps réel) et rapidement, et en consommant le moins de connexion possible, disons que maintenant plus on consomme et plus ça charge vite, mais j'ai toujours eu ce bug en utilisant les sockets SFML (TCP/UDP)
L'envoi ne doit pas poser de problèmes, c'est la réception qui pose problème a mon avis puisque c'est celui qui reçoit qui bloque et pas celui qui envoie, et que j'ai testé de connecter plusieurs clients a la fois en même temps, je n'ai pas de perte de vitesse, donc le jeu est capable d'envoyer tout ça sans problèmes sur les 2 clients ça va aussi vite que si ils étaient tout seuls (sinon ça bloquerait coté serveur), et le débit est stable. En revanche la réception doit avoir un bug qui paralyse le socket en cours de réception de données...