В настоящее время я создаю приложение C / C ++, которое отправляет и получает файлы изображений через сетевой сокет. Однако когда я отправляю файл через сокет, целевой файл имеет небольшую разницу в байтах по сравнению с исходным файлом.
Чтобы приложение работало правильно, целевой файл (клиент) должен быть Идентично, побайтно, к исходному (серверному) файлу.
Код клиента:
int client_app(int argc, char *argv[]) {
// create a socket
int network_socket;
network_socket = socket(AF_INET, SOCK_STREAM, 0);
// specify an address for the socket
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(9002);
server_address.sin_addr.s_addr = INADDR_ANY;
// connect returns an integer
int connection_status = connect(network_socket, (struct sockaddr *) &server_address, sizeof(server_address));
if (connection_status == -1) {
printf("Error making connection to remote socket \n\n");
}
// read picture byte array
printf("Reading picture byte array...\n");
char p_array[BUFSIZ];
// convert it back into a pic
printf("Converting byte array to DNG...\n");
FILE *image = fopen("out_compressed.GPR", "w");
int nb;
while ((nb = read(network_socket, p_array, BUFSIZ)) > 0) {
fwrite(p_array, 1, nb, image);
bzero(p_array, BUFSIZ);
}
fclose(image);
// and then close the socket
close(network_socket);
}
Код сервера:
int server_app(int argc, char *argv[]) {
char *process_argv[100];
*process_argv = *argv;
int process_argc = 0;
for (int i = 1; i < 6; i++) {
process_argv[i] = argv[i + 1];
process_argc++;
}
process(process_argc, process_argv);
// create the server socket
int server_socket;
server_socket = socket(AF_INET, SOCK_STREAM, 0);
// define the port number
int port = 9002;
// define the server address
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(port);
server_address.sin_addr.s_addr = INADDR_ANY;
// bind the socket to our specified IP and port
bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address));
// listen for connections on the socket
listen(server_socket, 5);
// create client socket for the server to send data to
int client_socket;
client_socket = accept(server_socket, nullptr, nullptr);
// get picture size
char *fpath = process_argv[4];
FILE *picture;
picture = fopen(fpath, "r");
int size;
fseek(picture, 0, SEEK_END);
size = ftell(picture);
fseek(picture, 0, SEEK_SET);
// send picture size
write(client_socket, &size, sizeof(size));
// send picture as byte array
char send_buffer[BUFSIZ];
int nb = fread(send_buffer, 1, sizeof(send_buffer), picture);
while (!feof(picture)) {
write(client_socket, send_buffer, nb);
nb = fread(send_buffer, 1, sizeof(send_buffer), picture);
}
// then close the sockets
close(server_socket);
close(client_socket);
}
Когда я получаю файл на на стороне клиента он кажется того же размера, но я не могу выполнить некоторые операции сжатия на нем, в отличие от исходного файла.
При запуске cmp
в моем терминале для сравнения источника и целевые файлы, я получаю результат:
compressed.GPR out_compressed.GPR differ: char 1, line 1
Как я могу сделать так, чтобы эти файлы были побайтно идентичными?
Спасибо!