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
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 ]
