En fait je crois que mon code est nickel, ça marche sur des dizaines de configurations chez mes clients (poste serveur S à un endroit S et postes clients C à un endroit C)
depuis des années ! Vraiment...
C'est du send receive classique, MSDN pur jus.
Ca fait une semaine que j'essaie plein de trucs (bloquant, non bloquant, shutdown, close, morcellement différent, etc...) et rien n'y fait.
Je viens de m'apercevoir que cette config qui ne marche pas est la seule qui concerne deux machines distantes dotées d'une
Freebox dont
l'IP fixe ne diverge que par le dernier nombre (DSLAM commun j'imagine). En effet, ces deux PC sont dans le même quartier. Adresse 78.45.72.
110 pour le serveur et 78.45.72.
110 pour le clients (adresses fictives évidemment)
J'en ai une troisième avec un
autre fournisseur aussi dans le même quartier, et MIRACLE cette machine attaque le serveur S sans problème ! L'adresse IP est complètement différente.
En ce qui me concerne j'ai une freebox à mon domicile et j'attaque le serveur S sans problème.
Toujours plus fort, depuis le client C je peux attaquer le serveur d'un autre client situé ailleurs géographiquement.
Bref, plutôt que de mettre en doute le code, je commence donc à me demander si le pb ne vient pas d'un mauvais routage du côté de Free dans ce cas particulier, ce pb étant apparu qu'à partir de l'installation de la Freebox sur le site serveur et sur le site client. Avant, c'était moins rapide mais opérationnel !
La solution serait d'essayer un autre FAI sur le serveur, mais j'aimerais quand même comprendre.
Pour info, la partie du code qui déconne est le recv qui reste bloqué indéfiniment du coté client lorsque le serveur envoie une réponse de quelques kO (3229 octets par exemple)
lpBufCour= lpBuf ;
bPremLu = FALSE ;
dimlus = 0 ;
do
{
// Receive data from the server socket.
cBytesRead = recv (ServerSock, lpBufCour, 4096, 0) ;
if (cBytesRead > 0) // NB : SOCKET_ERROR retourne -1
{
dimlus += cBytesRead ;
if ((bPremLu == FALSE) && (dimlus >= 32))
{ // il faut aller chercher en tête du premier sous-bloc, la dimension totale attendue
lpRhead = (struct r_inconnu *) lpBuf ;
dimbloc = lpRhead->dimbloc ;
bPremLu = TRUE ;
}
lpBufCour += cBytesRead ;
}
else if (cBytesRead == SOCKET_ERROR)
{ char szError[512] ;
sprintf (szError, "pb recv WSAGetLastError () n°%d", WSAGetLastError ()) ;
OutputDebugString (szError) ;
OutputDebugString ("\n") ;
}
// else (cBytesRead == 0)
} while (cBytesRead != 0) ;
// NB : on doit bien avoir dimlus égal à dimbloc
// Disable receiving on ServerSock.
shutdown (ServerSock, 0x00);