[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