Problema de envío de estructura con fwrite() en el servidor TCP cliente.
Tengo una estructura de cuenta (como una cuenta bancaria) y quiero enviar la información de la cuenta al cliente cuando escribo “state” al inicio de la aplicación: ./client state
luego el servidor debe enviar la información del cliente, sin embargo tengo un problema para enviar la estructura con la función fwrite,
he implementado esto en mi servidor.c
...
if(strcmp(buffer, "state") == 0){
printf("enviando el estado de la cuenta...\n");
memcpy(buffer, &a1, sizeof(a1));
printf("%s\n", buffer);
size_t nb_write = fwrite(buffer, sizeof(char), sizeof(MAX_BUFF), client_array[0].file);
printf("número que escribí: %ld\n", nb_write);
if(fflush(client_array[0].file)){
syserr("error de fflush");
}
}
y en mi client.c he escrito esto:
...
if(argc > 1){
printf("argv[1]: %s\n", argv[1]);
size_t nb_write = fwrite(argv[1], sizeof(*argv), strlen(argv[1]), fdc);
printf("número que escribí: %ld\n", nb_write);
if(fflush(fdc)){
syserr("fflush");
}
}
size_t nb_read = fread(&buffer, strlen(buffer), sizeof(BUFF_SIZE), fdc); // recepción de la estructura
printf("número que leí: %ld\n", nb_read);
printf("%s\n", buffer);
la aplicación cliente está esperando con el fread()
La salida de ./server
:
número que leí: 4
state
enviando el estado de la cuenta...
account 1
número que escribí: 4
error de fflush: Búsqueda ilegal
Y cuando hago CTRL-C para detener el servidor, la aplicación cliente escribe algo extraño (quizás el contenido del búfer) y también se detiene la aplicación.
Creación de socket exitosa
¡Conexión exitosa!
argv[1]: state
número que escribí: 5
número que leí: 0
��E-�
Aquí está la estructura que quiero enviar:
struct account {
char title[MAX_TITLE_LENGTH];
struct user list_user[MAX_LIST_SIZE];
// char description[140]; // por ejemplo, hotel, mercado, viaje
int32_t total;
};
struct account a1;
/* CUENTA */
strcpy(a1.title, "cuenta 1");
a1.list_user[0] = u1;
a1.total = 0.0;
¿Cómo puedo arreglarlo para enviar la estructura correctamente en el descriptor de archivo del cliente y leerlo en el búfer de mi cliente?
davy.ai
Hay algunos problemas con la implementación actual:
memcpy
para copiar el contenido de la estructuraa1
albuffer
. Sin embargo, esto no convierte realmente la estructura en un formato de cadena que se pueda enviar a través del socket. En su lugar, es necesario convertir la estructura en una cadena antes de enviarla. Una forma de hacer esto es utilizar la funciónsprintf
para formatear la estructura en una cadena.En el código del cliente, se utiliza la función
fwrite
para escribir la cadenaargv[1]
en el descriptor de archivofdc
, lo cual no es correcto. En su lugar, la cadenaargv[1]
debe ser enviada a través del socket al servidor utilizando la funciónsend
.En el código del cliente, se utiliza la función
fread
para leer la información de la cuenta del descriptor de archivofdc
, lo cual nuevamente no es correcto. En su lugar, se debe utilizar la funciónrecv
para recibir la información a través del socket desde el servidor.Aquí hay una versión actualizada del código del servidor:
Y aquí hay una versión actualizada del código del cliente:
En este código actualizado, la información de la cuenta se convierte a un formato de cadena utilizando la función
sprintf
y se envía a través del socket utilizando la funciónsend
. El cliente lee la información de la cuenta desde el socket utilizando la funciónrecv
.