[RoLUG] timeout dei socket in c

Ciro Mattia Gonano rolug@lists.linux.it
Sun, 13 Apr 2003 01:16:50 +0200


Cum Purpurea Rosa pulchritudinem admiratus eram,
Domini Die Idibus Aprilibus MMIII mihi appropinquavisti proclamavistique:

> if (connect(s,(struct sockaddr *)&sin,sizeof(struct sockaddr)) != -1)
>
s e` il tuo file descriptor, vero?
sin e` la tua sockaddr_in, giusto?
E dunque perche' leggere solo sizeof(sockaddr)?
Poi non dimenticare che, anche se connect ritorna sempre -1 in caso di errore,
molte altre funzioni ritornano direttamente l'errore, quindi fai il check in !=0

> {	    	FILE *f;
> 	    	f = fdopen(s, "r");
> 	    	setbuf(f, NULL);
> 		while (!feof(f) && fgets(buffer2, sizeof(buffer2), f) != NULL)
> 			printf(buffer2);
> 		fclose(f);
> }
>
qua non capisco perche' tu vada a chiamare funzioni ANSI per lavorare su file,
quando hai uno stream TCP... visto che la chiamata a socket+connect e` specifica
Linux, ti conviene continuare ad usare le syscall, sono piu` veloci perche'
lavorano in kernel space eliminando un layer.

Proviamo a modificare qualcosa...

<CODE>
...
#include <errno.h>
...
if(connect(s,(struct sockaddr*)&sin,sizeof(sin))!=0) {
	fprintf(stderr,"Ouch! We had an error connecting!\n"
			"Error was: %d \"%s\"\n",errno,strerror(errno));
	fflush(stderr);
	exit(EXIT_FAILURE);
} else {
	int r,w;
	do {
		r=read(s,buffer2,sizeof(buffer2));
		w=write(1,buffer2,sizeof(buffer2));
	} while(r==sizeof(buffer2));
}
</CODE>

Occhio: ho scritto il codice in 5 minuti, non l'ho ricontrollato e potrebbe non
funzionare mai; d'altronde, senza il codice completo non posso controllare,
quindi vedi tu se funge, altrimenti proviamo in altri modi.

Adieu,
-- 
Lestat de Lioncourt  -- a.k.a --  Ciro Mattia Gonano
 Undergraduate student in Computer Science at University of Bologna
 IHGGer #1049   <=>  ICQ#: 52631406   <=>   URL: http://www.CS.UniBO.It/~gonano
 Debian admin at Students.CS.UniBO.It <=> look at headers for my JabberID & GPG