2008-09-27 11 views
5

Usando la programación de socket C/C++, y el método "read (socket, buffer, BUFSIZE)". ¿Qué es exactamente el "buffer" que sé que char y byte son la misma cosa, pero ¿importa cuántos elementos tiene la matriz de bytes? ¿El buffer necesita poder contener todo el mensaje hasta el carácter nulo?Cómo crear un búfer para leer datos de socket en C

+0

¿Este carácter nulo es enviado por el remitente de Tus mesasage? –

+0

No, desafortunadamente debo agregarlo al final de la carga útil esperada –

+0

¿Conoce el tamaño del mensaje, o el final marcado de alguna manera? –

Respuesta

12

BUFSIZE debe ser igual al tamaño de su búfer en bytes. read() dejará de leer cuando el buffer esté lleno. Aquí está un ejemplo:

#define MY_BUFFER_SIZE 1024 

char mybuffer[MY_BUFFER_SIZE]; 
int nBytes = read(sck, mybuffer, MY_BUFFER_SIZE); 
+0

Gracias, pero eso solo responde mi pregunta parcialmente. Supongo que lo que busco es ¿qué sucede si la secuencia que se va a leer es más grande que el buffer? –

+1

Heat Miser: Sigues leyendo hasta que read() devuelve 0. –

+1

Disculpa, eso no estaba muy bien redactado. Quise decir: tienes que hacer tus lecturas en un ciclo. Cada vez que pasa por el bucle, procesa lo que hay en el búfer (aunque solo sea para agregar su contenido a una cadena). El ciclo termina cuando read() devuelve 0. –

0

Su aplicación enchufes no requiere de la memoria intermedia, para ser lo suficientemente grande, para contener el mensaje completo a ciencia cierta, pero podría ser conveniente dependiendo de, lo que está haciendo.

5

Como siempre, use sizeof cuando tenga la oportunidad. Usando el operador incorporado sizeof, le pide al compilador que calcule el tamaño de una variable, en lugar de especificarlo usted mismo. Esto reduce el riesgo de introducir errores cuando el tamaño de la variable real es diferente de lo que piensas.

Así, en lugar de hacer

#define BUFSIZE 1500 
char buffer[BUFSIZE]; 
int n = read(sock, buffer, BUFSIZE); 

que realmente debe utilizar

char buffer[1500]; 
int n = read(sock, buffer, sizeof buffer); 

Note como usted no necesita paréntesis alrededor del argumento de sizeof, a menos que el argumento es el nombre de un tipo .

+0

unwind: ¿eso es cierto en C o solo en C++? (Lo siento, solo estoy familiarizado con C/C). – benc

+0

oye, disculpa por molestarte en una pregunta muy antigua. Me enfrento a un problema similar y estaría realmente feliz si pudieras darme tu opinión sobre lo que podría estar causando eso. ¡Por adelantado! Espero que no te importe. En caso, esta es la [pregunta] (http://stackoverflow.com/questions/12070203/image-stream-sent-over-socket-server-issue)! – Matteo

Cuestiones relacionadas