2016-04-13 9 views
1

私は、クライアントとサーバに接続し、サーバが応答して.exeファイルを送信するためのコードを書いています。私は自分のコードを書くためにSFMLネットワーキングライブラリを使用しています。私は正常に正しいサイズでファイルを送信することができますが、何かが変更されていることを意味する間違ったmd5sumが、私はどこを把握することはできません。 私のコードは、誰かが私の間違いを発見することができます。 断絶:SFMLのTCPソケットとパケットを使用してファイルが破損する

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

['sf :: Socket :: Status' enum](http://www.sfml-dev.org/documentation/2.3/classsf_1_1Socket.php#a51bf0fd51057b98a10fbb866246176dc)に「エラー」以上のものがあります。それが完了したときにのみ成功転送を考慮してください。 – Hiura

+0

それは私がそれを試したことを送信します。 sendメンバーとrecieveメンバーは、パケット使用時にブロックされ、完了するまで続行されません。 – Jrank2013

+0

だから私は16進エディタを使ってそれを開き、最後に向かってバイトが失われていることに気づいた。これを引き起こす可能性のあるアイデア – Jrank2013

答えて

1

あなたのファイルはバイナリファイルです。それは数多くの文字列ではありません。それをネットワーク経由で送信しなくても、既にそれが読み取られています。

#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コードです。

+0

パケットを閉じるには、データをcharに入れて、それをcharポインタにしなければならないという定義がありません。 – Jrank2013

+0

@ Jrank2013右、 'char'をどこでも' Int8'で置き換えてください。 – nvoigt

+0

Int8はcharデータを格納できますか? – Jrank2013

関連する問題