Newsgroup: it.comp.os.linux.development
Titolo: alcune domande sui socket

Salve a tutti, sto lavorando su dei file descriptor associati a delle 
socket di rete (socketFD) e sono alle prese su alcune questioni delle 
quali non risco a trovare soluzione.
1)
Quando faccio send su di una socket, capita che il buffer per l'invio 
sia saturo e quindi di non riuscire ad inviare tutti i Bytes di cui ho 
necessita'.
La soluzione che ho adottato e' stata quella di ciclare fino a che non 
scrivo tutto quello che ralmente dovevo e devo dire che funziona, ma mi 
piacerebbe poter recuperare l'informazione di quanti Bytes sono ancora 
disponibili sul buffer del SocketFD prima di saturarlo, cosi' da 
decidere quando scriverci e quanto, c'e' un modo ?
2)
Se mentre sto scrivendo su un socketFD (con la send) la connessione 
cade, come posso verificare che la connessione sia caduta ?
Ok, direi che e' tutto ;)
Grazie a tutti per l'interessamento
Ciao
	MaX

 cade, come posso verificare che la connessione sia caduta ?
Cosa vuol dire che la connessione cade? Che socket stai usando? TCP/IP?
Allora qualche operatione ritornerà un errore, tipo ETIMEDOUT.
Ciao,
-- 
Daniele Orlandi

 
Ciao e grazie

 (uso TCP)
Fai poll su POLLERR e poi prendi l'errore con una read().
Ciao,
-- 
Daniele Orlandi

 ioctl(s, SIOCOUTQ, &out_size);
Ma a te funziona ?
ho provato con:
	getsockopt(ss.FDN, SOL_SOCKET, SO_SNDBUF, &bufSize, &SZbufSize);
	ioctl(ss.FDN, TIOCOUTQ, &bufUsed);
	bufAvailable = bufSize-bufUsed;
poi ho letto "man 7 tcp" e ho letto:
TIOCOUTQ
Returns  the  amount of unsent data in the socket send queue in the 
passed integer value pointer. Unfortunately, the implementation
of this ioctl is buggy in all known versions of Linux and instead 
returns the free space (effectively buffer size minus bytes  used 
including  metadata) in the send queue. This will be fixed in future 
Linux versions.  If you use TIOCOUTQ, please include a runtime test for 
both behaviors for correct function on future releases and other Unixes.
e quindi ho provato con:
	ioctl(ss.FDN, TIOCOUTQ, &bufAvailable)
e poi con:
	bufAvailable = ioctl(ss.FDN, TIOCOUTQ, &bufUsed)
ma in tutti i modi, non riesco a determinare lo spazio che ho nel buffer :(
Dove sbaglio ?
Grazie a tutti.
Ciao
	MaX

 :(
IMHO stai seguendo la strada sbagliata[1], di quanto buffer hai o te ne
rimane, te ne deve fregare poco. In genere, o fai bloccare il processo, o
guardi quando ricevi EAGAIN.
Tu, però, non vuoi spiegare come vuoi usarle... indi... non so come
risponderti.
[1] A parte usare la notazione ungherese :)
-- 
Daniele Orlandi

 
quando invio un "pacchetto" da me creato come struttura dati, vorrei che 
arrivasse intero e non a pezzettini.
( il pacchetto e' grande 500B di payload + 12B di Header )
il fatto e' che usando l'applicazione di test, quasta "martella" 
pesantemente e spesso il buffer risulta troppo pieno (l'invio e' piu' 
lento dei dati che si stanno inviando) e questo mi comporta che a volte 
invio un pacchetto per (esempio) 510B anziche' 512B, e dall'altra parte 
aspetta di ricevere i 2Byte mancanti.
questo succedere proprio perche' ricevo degli EGAIN, ma se fosse 
possibili evitarli anzitempo ne sarei estremamente felice.
tutto qua.

 possibili evitarli anzitempo ne sarei estremamente felice.
Se ricevi degli EAGAIN significa che hai messo la socket in non-blocking. No
mettere la socket in non-blocking.
Ciao,
-- 
Daniele Orlandi