Я пишу код, чтобы клиент мог подключиться к серверу, а сервер — ответить и отправить файл .exe. Я использую сетевую библиотеку SFML для написания своего кода. Я могу успешно отправить файл с правильным размером, но с неправильной md5sum, что означает, что что-то меняется, но я не могу понять, где.
Вот мой код, может кто-то заметит мою ошибку.
Sever:
#include <SFML/Network.hpp>
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
int main()
{
std::string i{ "Hello World" };
sf::Packet packet;
//packet << i;
sf::TcpListener tcpl;
sf::TcpSocket tcps;
std::vector<std::string> Buffer;
std::string tmp;
std::ifstream fis("C:\\Users\\Cyber Security\\Documents\\Repos.git\\Agent\\x64\\Debug\\Project1.exe", std::ios::in | std::ios::binary);tcpl.listen(5050);
std::cout << "Listening" << std::endl;
tcpl.accept(tcps);
while (std::getline(fis,tmp))
{
Buffer.push_back(tmp);
};
packet << static_cast<sf::Uint32>(Buffer.size());
for (std::vector<std::string>::const_iterator it = Buffer.begin(); it != Buffer.end(); ++it)
packet << *it;
sf::Socket::Status status = tcps.send(packet);
if (status == sf::Socket::Error)
std::cout << "Error";
fis.close();
std::cout << "Packet Sent" << std::endl;
tcpl.close();
std::cout << "Socket Closed" << std::endl;
system("pause");
return 0;
}
Клиент:
#include <SFML/Network.hpp>
#include <string>
#include <fstream>
#include <vector>
#include <iostream>
int main()
{
std::string h{ "" };
sf::Packet packet;
sf::TcpSocket tcps;
sf::Uint32 size = 0;
std::vector<std::string> Buffer;
sf::TcpSocket::Status status= tcps.connect("10.10.10.10", 5050);
std::ofstream fis;
if (status == sf::TcpSocket::Status::Done)
{
fis.open("Project1.exe", std::ofstream::binary);
std::cout << "Starting Donwload of Packet" << std::endl;
status== tcps.receive(packet);
if (status == sf::Socket::Error)
std::cout << "Error";
std::cout << "Packet Received" << std::endl;
}packet >> size;
for (sf::Uint32 i = 0; i < size; ++i)
{
std::string item;
packet >> item;
Buffer.push_back(item);
}
for (std::vector<std::string>::const_iterator it = Buffer.begin(); it != Buffer.end(); ++it)
fis << *it;
fis.close();system("pause");
return 0;
}
Ваш файл является двоичным файлом Это не количество строк. Чтение этого как такового уже пропускает байты, даже без отправки его по сети. Рассматривайте ваш файл как последовательность байтов:
#include <SFML/Network.hpp>
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
int main()
{
sf::Packet packet;
sf::TcpListener tcpl;
sf::TcpSocket tcps;
std::ifstream fis("C:\\Users\\Cyber Security\\Documents\\Repos.git\\Agent\\x64\\Debug\\Project1.exe", std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(fis)), std::istreambuf_iterator<char>());
fis.close();
tcpl.listen(5050);
std::cout << "Listening" << std::endl;
tcpl.accept(tcps);
packet << static_cast<sf::Uint32>(fileContents.size());
for (std::vector<char>::const_iterator it = fileContents.begin(); it != fileContents.end(); ++it) packet << *it;
sf::Socket::Status status = tcps.send(packet);
if (status == sf::Socket::Error)
std::cout << "Error";
std::cout << "Packet Sent" << std::endl;
tcpl.close();
std::cout << "Socket Closed" << std::endl;
system("pause");
return 0;
}
Клиент:
#include <SFML/Network.hpp>
#include <string>
#include <fstream>
#include <vector>
#include <iostream>
int main()
{
sf::Packet packet;
sf::TcpSocket tcps;
sf::Uint32 size = 0;
sf::TcpSocket::Status status = tcps.connect("10.10.10.10", 5050);
if (status == sf::TcpSocket::Status::Done)
{
std::cout << "Starting Download of Packet" << std::endl;
status == tcps.receive(packet);
if (status == sf::Socket::Error)
std::cout << "Error";
std::cout << "Packet Received" << std::endl;
}
std::ofstream fos("Project1.exe", std::ofstream::binary);
packet >> size;
for (sf::Uint32 i = 0; i < size; ++i)
{
char item;
packet >> item;
fos << item;
}
fos.close();
system("pause");
return 0;
}
Клиенту по-прежнему не хватает обработки ошибок, но в любом случае это код POC.
Других решений пока нет …