2016-04-13 28 views
1

Bir istemci ve bir sunucuya bağlanmak ve bir .exe dosyası göndermek için sunucuya bağlanmak için kod yazıyorum. Kodumu yazmak için SFML ağ kitaplığı kullanıyorum. Dosyayı doğru boyutta gönderebilirim ancak yanlış md5sum bir şeylerin değiştiğini gösterir ama nerede olduğunu anlayamıyorum. İşte benim kodum birileri hatamı tespit edebilir. Sever:Dosya SFML TCP Yuvaları ve paketleri kullanarak Bozuk Geliyor

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

Müşteri:

#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

['sf :: Socket :: Status' enum] (http://www.sfml-dev.org/documentation/2.3/classsf_1_1Socket.php#a51bf0fd51057b98a10fbb866246176dc) dosyasında" Hata "dan daha fazlası var. Başarı transferini yalnızca 'Bitti' olduğunda dikkate aldığınızdan emin olun. – Hiura

+0

Yapılan göndermeden önce denedim. Gönderme ve alma üyeleri paketler kullanırken engelleniyor ve bitene kadar devam etmeyecek. – Jrank2013

+0

Bu yüzden bir hex editörü kullanarak açtım ve sonuna doğru bir bayt kaybettiğimi fark ettim. Bu – Jrank2013

cevap

1

Dosyanız bir ikili dosyadır. Bu bir dizi ip değil. Bu şekilde okumak, ağ üzerinden göndermeden bile, zaten eksik baytlardır.

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

Müşteri:: bayt dizisi olarak Dosyanızı davranın

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

istemci yine hata işleme bir çok eksik, ama yine de POC kod.

+0

Paket paketini kapatın, char'e veri eklemek için bir tanımınız yok, bunu bir char işaretçisini yapmak zorundasınız. – Jrank2013

+0

@ Jrank2013 Doğru, her yerde 'char' ile Int8'in yerini al. – nvoigt

+0

Int8, char verilerini depolayabilir mi? – Jrank2013

İlgili konular