2016-04-13 8 views
1

Ich schreibe Code für einen Client, um eine Verbindung zu einem Server und dem Server zu reagieren und eine EXE-Datei senden. Ich verwende die SFML-Netzwerkbibliothek, um meinen Code zu schreiben. Ich kann die Datei erfolgreich mit der richtigen Größe senden, aber die falsche md5sum, was bedeutet, dass etwas geändert wird, aber ich kann nicht herausfinden, wo. Hier ist mein Code kann jemand meinen Fehler erkennen. Sever:Datei wird beschädigt mit SFML TCP-Sockets und packet

#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; 
} 

Auftraggeber:

#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; 
} 
+1

Es gibt mehr als "Fehler" in der ['sf :: Socket :: Status 'Enum] (http://www.sfml-dev.org/documentation/2.3/classsf_1_1Socket.php#a51bf0fd51057b98a10fbb866246176dc). Stellen Sie sicher, dass die Übertragung des Erfolgs nur dann in Betracht gezogen wird, wenn es fertig ist. – Hiura

+0

Es sendet fertig Ich habe es gerade versucht. Die Sende- und Empfangselemente blockieren bei der Verwendung von Paketen und werden erst fortgesetzt, wenn sie abgeschlossen sind. – Jrank2013

+0

Also öffnete ich es mit einem Hex-Editor und bemerkte, dass ich gegen Ende ein Byte verlor. Irgendeine Idee was könnte dazu führen, – Jrank2013

Antwort

1

Ihre Datei ist eine Binärdatei. Es ist nicht eine Anzahl von Strings. Wenn Sie es lesen, fehlen bereits Bytes, auch wenn Sie es nicht über ein Netzwerk senden. Behandeln Sie Ihre Datei als eine Folge von Bytes:

#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; 
} 

Auftraggeber:

#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; 
} 

Der Kunde ist immer noch eine Menge Fehlerbehandlung fehlt, aber es ist POC Code sowieso.

+0

Close packet haben keine Definition für das Einfügen von Daten in Char müssen Sie es zu einem Char-Zeiger machen. – Jrank2013

+0

@ Jrank2013 Richtig, ersetzen Sie einfach 'char' durch' Int8' überall. – nvoigt

+0

Int8 kann Char-Daten speichern? – Jrank2013