Newsgroup: it.comp.os.linux.development
Titolo: aiuto!: non riesco a chiudere la socket

Salve a tutti! Ho un problema con un semplicissimo programmino server
che usa le socket... si tratta di questo... sebbene la chiamata a close()
per chiudere la socket di servizio vada a buon fine, la connessione non
viene chiusa immediatamente!
allego alla lettera il codice dei due programmini ("funzionanti")...il
server attende che il client si connetta, aspetta che gli venga spedita
una stringa, la stampa e poi si rimette in attesa; il client si connette
al server, chiede in input all'utente una stringa, la spedisce ed esce
dopo aver attivato in background il server, spedisco qcosa con il client;
poi, se vado a vedere la lista delle connessioni con il netstat, trovo
una linea tipo
127.0.0.1:10001
 
127.0.0.1:2320
  WAIT
dove 10001 e' la bound port che uso per il server, mentre 2320 e' stata
dinamicamente associata per la connessione client-server
dopo "qualche tempo", l'entrata incriminata del netstat svanisce...
se spedisco piu' richieste dal client, come mi attendo, ottengo qualcosa
di questo tipo...
127.0.0.1:10001
 
127.0.0.1:2320
  WAIT
127.0.0.1:10001
 
127.0.0.1:2321
  WAIT
127.0.0.1:10001
 
127.0.0.1:2322
  WAIT
127.0.0.1:10001
 
127.0.0.1:2323
  WAIT
questo e' il codice del server
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#define bufsize 256
int main(int argc,char *argv[])
{
 static char buffer[bufsize]="";
 int lsocket,newsocket;
 struct sockaddr_in sin;
 lsocket=socket(AF_INET,SOCK_STREAM,0);
 sin.sin_family=AF_INET;
 sin.sin_port=htons(10001);
 sin.sin_addr.s_addr=INADDR_ANY;
 bind(lsocket,&sin,sizeof(sin));
 listen(lsocket,5);
  while (1)
  {
   newsocket=accept(lsocket,NULL,NULL);
   printf ("waiting\n");
   recv(newsocket,buffer,bufsize,0);
   printf("buffer: %s\n",buffer);
   close (newsocket);
  }
}
questo e' il codice del client che si connette alla porta 10001 del
localhost:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
 char s[256]="";
 int mysocket;
 struct sockaddr_in sin;
 mysocket=socket(AF_INET,SOCK_STREAM,0);
 sin.sin_family=AF_INET;
 sin.sin_port=htons(10001);
 sin.sin_addr.s_addr=inet_addr("127.0.0.1");
 connect(mysocket,&sin,sizeof(sin));
 scanf ("%s",s);
 send(mysocket,s,256,0);
  close (mysocket);
 return 0;
}
credo che il mio problema sia materiale ultra-standard... ringrazio sin
da subito chiunque voglia rispondermi...
ciao
  Lorenzo

viene chiusa immediatamente!
Anche io ho riscontrato lo stesso problema ....
Non ho ben chiaro il motivo, ma guarda questo pezzo di codice tratto dal
wu-ftp ( in particolare il file src/ftpd.c )
---------------------------
    	for (tries = 1;; tries++) {        
		if (bind(s, (struct sockaddr *)	&data_source,
                    sizeof(data_source)) >= 0)            
			break;
		if (errno != EADDRINUSE || tries > 10) goto bad;
		sleep(tries);    
    	}
[....]
	bad:
----------------------------
Quindi prova ad aprie una porta, SE non ci riesce *perche' in uso* riprova fino 
ad un massimo di 10 volte mettendo fra un tentativo e l'altro una pausa ( in 
secondi pari al numero del tentativo ).
Per cui:
	provo
	se mi dice male attendo 1 secondo
	provo
	se mi dice male attendo 2 secondi
	provo
	se mi dice male attendo 3 secondi
	provo
	[...]
	se mi dice male attendo 10 secondi
	provo
 
	se mi dice ancora male ( 11o tentativo )
	allora concludo che la porta NON e' disponibile.
	Sono passati 10*(10-1)/2 = 90 secondi ... 1 minuto e mezzo ...
Questo puo' dare l'idea di un timeout accettabile per capire se la
porta E' occupata, oppure se non si e' *ancora* liberata.
Comunque a me il problema lo dava per connessioni chiuse un po' bruscamente
... ( oppure il problema NON mi capitava se era il client a chiudere la
connessione, ma sto parlando di connessione peer-to-peer ...)
Fammi sapere se riesci a scopriore qualcos'altro.

mia macchina!!!
No le cose non stanno cosi'. In certe situazione la chiusura della socket e'
istantanea. Mi sembra di aver notato che cio' avviene quando e' il client a
chiudere la connessione ( in effetti se il client forza la chiusura della
connessione, NON ci dovrebbero essere pacchetti vaganti .... ) ...
Comunque anche io sono un inesperto di socket ...