C++ Boost Tcp客户端接收崩溃

C++ Boost Tcp客户端接收崩溃,c++,boost,tcp,boost-asio,boost-thread,C++,Boost,Tcp,Boost Asio,Boost Thread,我最近一直在为windows visual studio 2015的Boost库工作。我最近一直在开发一个服务器和客户端,它可以通过tcp连接轻松地传输数据。但最近我尝试向客户机发送一个Base64编码的文件字符串,大约是366660字节的数据。为此,我将数据分成大小约为1000的数据包。(不确定最大大小是多少)但无论如何,服务器发送数据完全正常,但当客户端接收到超过160000字节时,它会崩溃,没有例外 客户: try { for (static int i = 1000; i <

我最近一直在为windows visual studio 2015的Boost库工作。我最近一直在开发一个服务器和客户端,它可以通过tcp连接轻松地传输数据。但最近我尝试向客户机发送一个Base64编码的文件字符串,大约是366660字节的数据。为此,我将数据分成大小约为1000的数据包。(不确定最大大小是多少)但无论如何,服务器发送数据完全正常,但当客户端接收到超过160000字节时,它会崩溃,没有例外

客户:

try
{
    for (static int i = 1000; i <= sizeofpackets /*(366,660) (currently 170,000 for testing)*/; i += 1000)
    {
        char Buffer[1000];
        memset(Buffer, 0, 1000);
        boost::asio::read(s, boost::asio::buffer(Buffer, 1000));
        std::cout << i << std::endl;
    }
}
catch (std::exception& e)
{
    std::cerr << "Exception: " << e.what() << "\n";
}
试试看
{

对于(static int i=1000;i您还没有发布完整的代码,所以很难说,但您的问题可能是处理字符串的方式,而不是处理套接字传输的方式(substr()成员函数采用开始偏移量和大小,看起来您正试图对新数据使用不断增加的大小)

以下(完整)代码使用您的客户机和服务器代码作为参考,但字符串处理已更改,在我的计算机上传输170000字节,因此可能会有所帮助:

#include <boost/asio/io_service.hpp>
#include <boost/asio/write.hpp>
#include <boost/asio/read.hpp>
#include <boost/asio/buffer.hpp>
#include <boost/asio/streambuf.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <array>
#include <string>
#include <iostream>


namespace
{
    const size_t BIG_MESSAGE_SIZE = 170000;
    const size_t BLOCK_SIZE = 1000;

    void doTX(boost::asio::ip::tcp::socket& socket, size_t& TXsize)
    {
        char rawBuffer[BIG_MESSAGE_SIZE] = { 0 }; // raw data to send
        std::string encodedBuffer(rawBuffer, BIG_MESSAGE_SIZE);
        for (size_t i = 0; i < BIG_MESSAGE_SIZE; i += BLOCK_SIZE)
        {
            std::string NewData = encodedBuffer.substr(i, BLOCK_SIZE);
            TXsize += boost::asio::write(socket, boost::asio::buffer(NewData, BLOCK_SIZE));
        }
    }

    void doRX(boost::asio::ip::tcp::socket& socket, size_t& RXsize)
    {
        for (size_t i = 0; i < BIG_MESSAGE_SIZE; i += BLOCK_SIZE)
        {
            char Buffer[BLOCK_SIZE];
            memset(Buffer, 0, BLOCK_SIZE);
            RXsize += boost::asio::read(socket, boost::asio::buffer(Buffer, BLOCK_SIZE));
        }
    }
}

int main(int argc, char * argv[])
{
    std::cout << "Running:" << std::endl;

    int port = 9876;

    boost::asio::io_service ios;
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), port);
    boost::asio::ip::tcp::acceptor acceptor(ios, endpoint);
    boost::asio::ip::tcp::socket TXsocket(ios);
    boost::asio::ip::tcp::socket RXsocket(ios);

    TXsocket.connect(endpoint);
    acceptor.accept(RXsocket);

    size_t TXsize = 0;
    size_t RXsize = 0;

    doTX(TXsocket, TXsize);
    doRX(RXsocket, RXsize);

    std::cout << TXsize << " " << RXsize << std::endl;

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
名称空间
{
const size\u t BIG\u MESSAGE\u size=170000;
const size\u t BLOCK\u size=1000;
void doTX(boost::asio::ip::tcp::socket&socket,size\u t&TXsize)
{
char rawBuffer[BIG_MESSAGE_SIZE]={0};//要发送的原始数据
字符串encodedBuffer(rawBuffer,大消息大小);
对于(大小i=0;istd::cout到目前为止,您试图确定崩溃的原因是什么?我将其调试为boost::asio::read,并且每次迭代都会重置缓冲区,因此不确定还要检查什么。我无法在一个数据包中发送366600字节的字符串,所以我将其拆分为每个1000字节的间隔数据包。这就是新数据正在更改的原因。我还将其更改为1024字节充分利用我的数据包,服务器发送的字符串似乎很好,但客户端似乎在某个点停止。@Opendn33是的,我知道您正在尝试做什么,但很遗憾,您没有发布完整的代码工作版本,因此我无法验证它是否按您的预期工作。如果您可以这样做,我将尝试提供帮助。如果没有,我建议您在每次调用write()时检查返回值,并使用该值更新实际发送的总数量(以我的代码为例),就像打印出NewData.size()一样+i-1000不可靠。我真的很感谢您的帮助,我刚刚检查了发送的字节返回的数据,它是数百万lol,所以我通过更改数据类型修复了它,现在它只发送1024个。我感谢您的帮助!
#include <boost/asio/io_service.hpp>
#include <boost/asio/write.hpp>
#include <boost/asio/read.hpp>
#include <boost/asio/buffer.hpp>
#include <boost/asio/streambuf.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <array>
#include <string>
#include <iostream>


namespace
{
    const size_t BIG_MESSAGE_SIZE = 170000;
    const size_t BLOCK_SIZE = 1000;

    void doTX(boost::asio::ip::tcp::socket& socket, size_t& TXsize)
    {
        char rawBuffer[BIG_MESSAGE_SIZE] = { 0 }; // raw data to send
        std::string encodedBuffer(rawBuffer, BIG_MESSAGE_SIZE);
        for (size_t i = 0; i < BIG_MESSAGE_SIZE; i += BLOCK_SIZE)
        {
            std::string NewData = encodedBuffer.substr(i, BLOCK_SIZE);
            TXsize += boost::asio::write(socket, boost::asio::buffer(NewData, BLOCK_SIZE));
        }
    }

    void doRX(boost::asio::ip::tcp::socket& socket, size_t& RXsize)
    {
        for (size_t i = 0; i < BIG_MESSAGE_SIZE; i += BLOCK_SIZE)
        {
            char Buffer[BLOCK_SIZE];
            memset(Buffer, 0, BLOCK_SIZE);
            RXsize += boost::asio::read(socket, boost::asio::buffer(Buffer, BLOCK_SIZE));
        }
    }
}

int main(int argc, char * argv[])
{
    std::cout << "Running:" << std::endl;

    int port = 9876;

    boost::asio::io_service ios;
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), port);
    boost::asio::ip::tcp::acceptor acceptor(ios, endpoint);
    boost::asio::ip::tcp::socket TXsocket(ios);
    boost::asio::ip::tcp::socket RXsocket(ios);

    TXsocket.connect(endpoint);
    acceptor.accept(RXsocket);

    size_t TXsize = 0;
    size_t RXsize = 0;

    doTX(TXsocket, TXsize);
    doRX(RXsocket, RXsize);

    std::cout << TXsize << " " << RXsize << std::endl;

    return 0;
}