Bonjour à tous,

je me suis codé un mini-client en C (pour envoyer des infos de debug sans (trop) consommer de CPU) et un mini-serveur en python pour recevoir ces fameuses infos.

Le hic, c'est qu'après 2 ou 3 envois réussis, le send du coté client me revoie une erreur alors que le serveur semble en bonne santé.

Pour essayer d'y voir plus clair, j'ai codé l'équivalant du serveur python en C, et là ça marche au poil.

Du coup, je me (vous) demande quelle différence il peut bien y avoir entre mon serveur python et mon serveur C ?

Voici le code du serveur python :
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
17
18
19
import os
import sys
import time
import SocketServer
 
 
def DumpingServer ( port,timeout ):
    class TCPHandler ( SocketServer.BaseRequestHandler ):
        def handle(self):
            print self.request.recv( 2000 )
    def timed_out () : server.is_alive = False
    server = SocketServer.TCPServer(('localhost',port),TCPHandler ) # test en local pour le moment
    server.timeout        = timeout   # <timeout> sec sans requête => terminaison
    server.is_alive       = True      # un nouvel attribut à <server>
    server.handle_timeout = timed_out
    while server.is_alive :
        server.handle_request()
 
DumpingServer( 55555,60*5 ) # timeout de 5min
Vous voyez que mon serveur est des plus simples, et très largement inspirés des exemples que l'on peut trouver sur la doc officielle.
Il écoute le port 55555 (en dur) et print tout ce qu'il reçoit.

Mon client en C (sous Visual Studio 2005) est un peu trop long pour que je le copie-colle ici, mais en gros, il s'articule autour de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SOCKET socketid ;          
socketid  = socket( AF_INET,SOCK_STREAM,IPPROTO_IP ) ;
 
struct sockaddr_in client ;
client.sin_family      = AF_INET ;
client.sin_addr.s_addr = inet_addr( "127.0.0.1" ) ; // test en local pour le moment
client.sin_port        = htons( 55555 ) ;
 
connect( socketid,(struct sockaddr*)&client,sizeof( client )) ;
 
for (;;)           
    {                         
    send( m->socketid,buffer,size,0 ) ; // buffer contient des infos de debug...
    }
Après 2 ou 3 envois + réceptions réussis, le send échoue et l'erreur est "10053 : Software caused connection abort."

Mon serveur en C (avec qui les envois+réceptions sont ok) ressemble au client :
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
17
SOCKET connfd = socket( AF_INET,SOCK_STREAM,IPPROTO_IP ) ;
 
struct sockaddr_in servaddr ;
servaddr.sin_family      = AF_INET ;
servaddr.sin_addr.s_addr = htonl( INADDR_ANY ) ;
servaddr.sin_port        = htons( 55555 ) ;
 
bind( connfd,(struct sockaddr*)&servaddr,sizeof( servaddr )) ;
listen( connfd,1 ) ;
SOCKET socketid = accept( connfd,NULL,NULL ) ;
 
for (;;)    
    {
    char buffer [1000] ;
    int received = recv( m->socketid,buffer,1000,0 ) ;
    fwrite( buffer,received,1,output ) ;
    }
Si quelqu'un comprend ce qui cloche dans mon serveur python, son avis serait le bienvenu.

Merci de m'avoir lu et de vos réponses !