nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

Re: read & write interi da socket TCP

Von: Giovanni (lsodgf0@home.net.it) [Profil]
Datum: 02.03.2008 16:23
Message-ID: <fqegpi$lac$1@milena.home.net.it>
Newsgroup: it.comp.os.linux.development
On 03/02/08 14:11, ale.ber wrote:

> Vorrei scrivere e leggere un intero su un socket TCP. Quindi una cosa
> del genere.
>
> // SCRITTURA
> int mess = 123;
> uint32_t mess_nbo = htonl(mess);
> int bytesent = write(newsockfd, &mess_nbo, sizeof(mess_nbo));

Nel corpo del pacchetto non c'è alcuna necessità di mettere i dati in
network order.  Solo se scrivi sul socket in modo raw e devi preparare
l'header devi convertire da host a network.

> // LETTURA
> uint32_t mess_nbo;
> int bytesrecv = read(sockfd, &mess_nbo, sizeof(mess_nbo));
> mess = ntohl(mess_nbo);

Come sopra.

> Il mio problema è che write e read non garantiscono di mandare tutto
> il messaggio, quindi sono responsabile di rimandare la parte mancante.
> Sempre se non erro..

Se non ci sono errori la write() garantisce di mandare tutti i byte e,
sempre se non ci sono errori la read() legge tutti i byte dal socket.
Puoi controllare, anzi devi, il valore ritornato dalla write() e dalla
read().  Mi sembra che solo nel caso che i dati

$ man 2 read write

> Quindi mi sono creato 2 funzioni che cercano di fare questo, solo che
> NON FUNZIONANO ;) Mi viene il dubbio che non posso fare una cosa del
> genere, dato che mi sembrano corrette.
>
> Qualcuno mi sa dire il come mai?
> Ringrazio anticipatamente..
> Ale
>
> /*
>  * Try to read the entire message from the socket
>  */
> int sockread(int sock, int *mess) {
> 	int readed = 0;
> 	int just_readed = 0;
> 	uint32_t mess_nbo;
> 	uint32_t *p = &mess_nbo;
> 	do {
> 		just_readed = read(sock, p + readed, 4);

Se leggi 4 byte 'p + readed' incrementa p di 16 byte.

> 		if (just_readed == -1) {
> 			return -1;
> 		}
> 		readed += just_readed;
> 		printf("Readed: %d/%d\n", just_readed, readed);
> 	} while ((just_readed > 0) && (readed < sizeof(uint32_t)));
> 	*mess = ntohl(mess_nbo);
> 	printf("%d - %d", *mess, mess_nbo);
> 	return readed;
> }
>
> /*
>  * Try to write the entire message on the socket
>  */
> int sockwrite(int sock, int mess) {
> 	uint32_t mess_nbo = htonl(mess);
> 	int written = 0;
> 	int just_written = 0;
> 	uint32_t *p = &mess_nbo;
> 	do {
> 		just_written = write(sock, p + written, 1);

Se scrivi un solo byte p deve essere un puntatore a char.  Altrimenti
'p + written' viene incrementato di 4 (punta al prossimo intero).

> 		if (just_written == -1) {
> 			return -1;
> 		}
> 		written += just_written;
> 		printf("Written: %d/%d\n", just_written, written);
> 	} while ((just_written > 0) && (written < sizeof(uint32_t)));

Su un socket la write() non dovrebbe ritornare 0.

> 	return written;
> }

Ci sono problemi di puntatori in entrambe le funzioni, ma mi sembrano
inutili.

Ciao
Giovanni
--
A computer is like an air conditioner,
it stops working when you open Windows.
Registered Linux user #337974  < http://giovanni.homelinux.net/ >

[ Auf dieses Posting antworten ]

Antworten