Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件使用SFML TCP套接字和包损坏_C++_Sockets_Tcp_Sfml_Packets - Fatal编程技术网

C++ 文件使用SFML TCP套接字和包损坏

C++ 文件使用SFML TCP套接字和包损坏,c++,sockets,tcp,sfml,packets,C++,Sockets,Tcp,Sfml,Packets,我正在编写代码,以便客户端连接到服务器,服务器响应并发送.exe文件。我正在使用SFML网络库来编写代码。我可以成功地发送大小正确但md5sum错误的文件,这意味着某些内容正在更改,但我不知道在哪里。 这是我的密码,有人能发现我的错误。 服务器: #包括 #包括 #包括 #包括 #包括 int main() { std::string i{“Hello World”}; sf::分组; //数据包您的文件是一个二进制文件。它不是多个字符串。即使不通过网络发送,这样读取它也会丢失字节。请将您的文件

我正在编写代码,以便客户端连接到服务器,服务器响应并发送.exe文件。我正在使用SFML网络库来编写代码。我可以成功地发送大小正确但md5sum错误的文件,这意味着某些内容正在更改,但我不知道在哪里。 这是我的密码,有人能发现我的错误。 服务器:

#包括
#包括
#包括
#包括
#包括
int main()
{
std::string i{“Hello World”};
sf::分组;

//数据包您的文件是一个二进制文件。它不是多个字符串。即使不通过网络发送,这样读取它也会丢失字节。请将您的文件视为一个字节序列:

#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;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
sf::分组;
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 fileContents((std::istreambuf_迭代器(fis)),std::istreambuf_迭代器();
fis.close();
tcpl.listen(5050);

std::难道不仅仅是“错误”吗只有在它的<代码>完成了时才考虑成功传输。它发送完成了。我只是尝试了。发送和接收成员在使用包的时候是阻塞的,并且直到完成为止才停止。所以我用一个十六进制编辑器打开它,注意到我正在丢失一个字节。到底有什么可能引起这一猜测:是YO吗?您的文件以
\n
结尾?由于
getline
将不包含在
tmp
中,因此您可能缺少一个字符。您可以尝试使用相同的程序,但不必读取文件--只需将数据直接存储在代码中--然后查看这是网络问题还是读/写问题。好的,我将尝试一下,我将返回packet没有将数据放入字符的定义,您必须将其设置为字符指针。@Jrank2013对,只需将
char
替换为
Int8
everywhere。Int8可以存储字符数据吗?@Jrank2013是的,Int8与字符一样有8位(一个字节)。这不起作用,因为Int8是有符号的,而字符是无符号的。这可能导致数据丢失。
#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;
}