Newsgroup: it.comp.os.linux.development
Titolo: problemi di sincronismo (?) con trasmissione TCP

Ciao a tutti.
ho scritto una applicazione client/server tra linux e windows.
Il server parte su windows ed è scritto in VB6 usando i socket
il client è una piccola applicazione su linux che invia, di tanto in tando
alcuni dati.
Quello che mi capita è che, in maniera random (sembra) linux mi faccia due
invii di dati consequenziali senza aspettare la risposta
dal server.
il client, semplificando, fa una cosa tipo:
#define PORT 3490
#define MAXDATASIZE 5120
CLIEXE( char *msg)
{
  ...
...
   char buf[MAXDATASIZE];
   char sendbuf[MAXDATASIZE];
....
...
 if ((he=gethostbyname(argv)) == NULL)
   {
     perror("gethostbyname");
     exit(1);
   }
 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
   {
     perror("socket");
     exit(1);
   }
   their_addr.sin_family = AF_INET;
   their_addr.sin_port = htons(PORT);
   their_addr.sin_addr = *((struct in_addr *)he->h_addr);
   bzero(&(their_addr.sin_zero), 8);
   if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct
sockaddr)) == -1)
    {
       perror("connect");
       exit(1);
     }
   if (!send(sockfd,sendbuf,MAXDATASIZE ,0))
        perror("send");
   if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
     {
       perror("recv");
       exit(1);
     }
   buf[numbytes] = '\0';
    close(sockfd);
   return 0;
}
Il server su windows invece:
....
...
Private Sub WSCK_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim msg$
    WSCK(Index).Tag = 0
    WSCK(Index).GetData msg, vbString
    msg = Trim(msg)
 If msg <> "" Then
    campi = Split(msg, ";", -1, vbTextCompare)
    ncampi = UBound(campi)
    nparametri = ncampi - 2
   Select Case campi(0)
...
...
...
Quello che succede è che, nonostante io chiami solo una volta il client su
linux, il server riceve (non sempre) due "trasmissioni".
La prima volta col buffer giusto e la seconda volta con delle schifezze....
Ora, dubitando di principio del windows, ho scritto anche un client windows.
In questo caso tutto funza corretamente.
Vi viene in mente qualche  motivo?
Grazie
Ioson

 Vi viene in mente qualche  motivo?
Diverse implementazioni del TCP/IP possono avere diverse unita' massime 
di trasferimento e/o policy di scodamento pacchetti.
Considera anche che un socket descriptor puo' scattare in seguito a una 
close dal lato remoto e in quel caso read ti ritorna 0 bytes, questo 
comportamento significa appunto "connection closed by foreign host", ma 
tu potresti per sbaglio trattarlo come un'ulteriore ricezione di dati!
Bye,
  Gabry

 stream.
OK allora mi stai dicendo che è compito di chi riceve gestire
Ho capito bene?
capisco anche il resto, ma ho un problema...
perchè con i socket windows questo non succede?
se mando 1000 Bytes mi arrivano 1000 bytes; se ne mando 100000 me ne arivano
100000 e non mi vengono spezzati
in vari invii, o meglio, me li trovo tutti nel buffer senza letture
aggiuntive.
Ad onor del vero pensavo che sa la vedesse il socket a riempire il buffer
che eventualmente si "spezza" durante la trasmissione.
In verità io credo che il problema sia che ci sono + ivii di buffer interi
( a causa di mio errore ed è per questo che ho postato il sorgente)
e non + invii che totalmente mi compongono il buffer originale.
Adesso provo e ti faccio sapere, ma non sono convinto (San Tommaso
docet)...:))
Grazie

Ti aggiorno sulle prove fatte.
I messaggi che arrivano sono tutti interi, cioč vengono duplicati gli invii
(non il contenuto.. il secondo invio č vuoto).
Inoltre, c'č un problema piů serio, se faccio due invii molto vicini,
talvolta il secondo non parte.
Tieni presente che ad ogni invio, ho una apertura del socket, un invio ,
un'attesa di una  risposta di un carattere e la chiusura.
Quando il secondo non parte, ho un errore di "connection refused", come se,
il server sia ancora occupato.
E' anche per questo che mi sembrava che il problema fosse di sincronismo.
Che ci sia qualche tipo di "wait" da inserire che non conosco?
Ciao