提升TCP客户端接收崩溃
Boost Tcp Client Receive Crash
我最近与Windows Visual Studio 2015的Boost库一起工作。但是最近,我试图将Base64编码的文件字符串发送给客户端,该文件大约是366,660字节的数据。为此,我将数据分为大约1000的数据包。(不确定最大尺寸是什么(但是无论如何,服务器完全可以发送数据,但是当客户端收到超过160,000个字节时,它崩溃了。
客户端:
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";
}
服务器:
for (int i = 1000; i <= 170000; i += 1000)
{
std::string NewData = encodedBuffer.substr(i - 1000, i);
NewData.erase(0, i - 1000);
boost::asio::write(*sock, boost::asio::buffer(NewData, 1000));
std::cout << NewData.size() + i - 1000 << std::endl;
NewData.clear();
}
任何评论或建议都会有很大帮助!
您尚未发布完整的代码,因此很难说,但是您的问题可能是您处理字符串的方式,而不是处理套接字传输的方式(substr((成员函数具有起始偏移量和大小,看起来您正在尝试为newdata使用越来越多的尺寸(。
使用您的客户端和服务器代码作为参考的以下(完整(代码,但是随着字符串处理更改,可以在我的计算机上传输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;
}
相关文章:
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- C++套接字客户端到 Python 服务器未创建连接
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- C/C++ Linux 上的多线程服务器/客户端崩溃
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 螺纹安全管道端接
- 如何在C / C++中正确实现链接列表而不会使程序崩溃
- Visual Studio 2017 ARM 交叉编译链接器崩溃
- 无法将套接字绑定到 IPv4 和 IPv6 中的端口
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- TCP套接字(客户端-服务器)recv()返回-1值
- CreateProcess在退出后占用套接字端口(每个套接字地址只允许使用一次)
- Asio端接插座功能:取消、关闭、关闭、释放
- 防止客户端套接字程序崩溃CPP Google Protobuf
- Unix域套接字(C++)-客户端使服务器守护进程崩溃
- 如何使用Telnet库从服务器发送查询和从客户端接收回显