C++服务器,System.10014 错误,使用加速
C++ Server, System.10014 error, using Boost
更新:我想通了!有点。。。我不确定这是如何解决的,但它确实解决了。而不是使用:
NetworkMessage msg;
msg.AddByte(0x01);
sendmessage(msg);
我试过这个,它有效(对某些功能几乎没有更改)
NetworkMessage* msg = new NetworkMessage();
msg.AddByte(0x01);
sendmessage(msg);
这修复了它,但仍然希望任何人解释为什么首先会发生这种情况。将其发布为答案,以便我可以标记它。谢谢。
我一直在TCP服务器上工作,但我遇到了一个小问题。
有一个循环发送大约 600 条消息,一次发送 1 条(从排队的消息列表中读取)。
出于某种原因,大约有 200 个没有错误地到达我的客户端,然后我收到 System.10014 错误。每次使用不同的消息,即使每次消息都相同。另外,如果我只是在System.10014错误后重新发送消息,它可以正常工作。所以很明显,信息不是问题。但我不知道是什么。我昨天花了一整天的时间试图弄清楚,但仍然没有运气。所以我来了。再。
void outputMessage(NetworkMessage& msg, bool forceTrue = false)
{
if(!connectionLocked || forceTrue) {
connectionLocked = true;
std::cout << "Message: ";
char* buf = msg.getOutputBuffer();
for (int i = 0; i < msg.size(); i++){
std::cout << (buf[i] + 0) << ":"; //Never any errors
}
boost::asio::async_write(socket_, boost::asio::buffer(msg.getOutputBuffer(), msg.size()),boost::bind(&Session::handle_write, shared_from_this(), msg, boost::asio::placeholders::error));
}
else {
//Queue message
_msgqueue.push_back(msg);
}
}
void handle_write(NetworkMessage& msg, const boost::system::error_code& error)
{
if (error)
{
cout << "Error: " << error << endl;
outputMessage(msg, true); //works, even though it's the same message
}
else {
if(_msgqueue.size() != 0){
//cout << "Sending queued message #" << _msgqueue.size() << endl;
outputMessage(_msgqueue.front(), true);
_msgqueue.pop_front();
}
else
connectionLocked = false;
}
}
这基本上是我的发送函数的代码。通常,它工作正常。由于某种原因,当我连续发送大量消息时,会发生此错误(System.10014)。我尝试阅读有关 Winsock 中的错误,但我真的不明白它(它说了一些关于无效指针的内容,但我很确定该消息是有效的,因为再次发送它就可以了?而且我在编程方面经验不足,尤其是在C++和指针方面,所以我遇到了一点麻烦。
生成消息的循环有点像这样。我验证了 X 和 Y 是有效的,所以我很确定问题不存在。
map->cursor = map->begin;
while(map->cursor != NULL)
{
//I'm not sure if pointers like this are supposed to be deleted?
//I suck when it comes to memory management, and most other things :D
Tile* tile = map->cursor->tile;
if(tile){
NetworkMessage msg;
msg.AddByte(0x03);
msg.AddByte(tile->posx);
msg.AddByte(tile->posy);
msg.AddByte(1);
msg.AddByte(2);
outputMessage(msg);
}
else
break;
map->cursor = map->cursor->next;
}
另外,这似乎无关紧要,但是如果我尝试将输出消息更改为以下内容:
void outputMessage(NetworkMessage& msg)
{
boost::asio::async_write(socket_, boost::asio::buffer(msg.getOutputBuffer(), msg.size()),boost::bind(&Session::handle_write, shared_from_this(), msg, boost::asio::placeholders::error));
}
void handle_write(NetworkMessage& msg, const boost::system::error_code& error)
{
if (error)
{
cout << "Error: " << error << endl;
}
}
我没有收到任何错误,但发送的消息都是克隆。因此,这 600 条消息看起来都一样。这看起来很奇怪,所以我认为这可能与我现在遇到的问题有关。
还有这里是NetworkMessage.h,我也把它贴在pastebin上,你可以在评论中看到。
#ifndef _NETWORK_MESSAGE_H
#define _NETWORK_MESSAGE_H
class NetworkMessage
{
public:
enum { header_length = 2 };
enum { max_body_length = NETWORKMESSAGE_MAXSIZE - header_length};
NetworkMessage()
{
buf_size=0;
m_ReadPos=header_length;
}
void AddByte(char byte_)
{
if (!canAdd(1)) return;
data_[m_ReadPos++] = byte_;
//data_[m_ReadPos] = ' ';
buf_size++;
}
uint16_t PeekU16(){
return (data_[1] | uint16_t(data_[0]) << 8);
}
uint16_t GetU16(){
m_ReadPos += 2;
return (data_[m_ReadPos+1]) | (uint16_t(data_[m_ReadPos]) << 8);
}
uint8_t GetByte(){return data_[m_ReadPos++];}
char* getBuffer()
{
return (char*)&data_[m_ReadPos];
}
char* getOutputBuffer()
{
writeMessageLength();
return (char*)&data_[0];
}
void setMessageLength(uint16_t v)
{
buf_size=v;
}
void writeMessageLength()
{
*(uint8_t*)(data_) = (buf_size >> 8);
*(uint8_t*)(data_+1) = buf_size;
}
void reset()
{
m_ReadPos = 0;
buf_size = 0;
}
uint16_t size(){return buf_size+header_length;}
protected:
inline bool canAdd(uint32_t size)
{
return (size + m_ReadPos < max_body_length);
};
private:
uint8_t data_[NETWORKMESSAGE_MAXSIZE];
uint16_t buf_size;
uint16_t m_ReadPos;
};
#endif //_NETWORK_MESSAGE_H
更新:好吧,遇到了一些奇怪的事情...
function error_func(NetworkMessage& msg){
cout << &msg << endl; //0x2882e8(not 0x274c0e8)
send(msg.getOutputBuffer(), msg.size(), error_func, msg); //no error
}
cout << &msg << endl; //0x274c0e8
send(msg.getOutputBuffer(), msg.size(), error_func, msg); //error system.10014
显然这不是真正的代码,但你明白了......我想这就是为什么从error_func工作重新发送它的原因。毕竟,问题可能出在网络消息中。我一直在所有错误的地方搞砸:D仍然需要帮助,哈哈。
真的很感激任何帮助,我被困住了。感谢您的阅读,如果你走到了这一步..
void outputMessage(NetworkMessage& msg, bool forceTrue = false)
{
if(!connectionLocked || forceTrue) {
connectionLocked = true;
std::cout << "Message: ";
char* buf = msg.getOutputBuffer();
for (int i = 0; i < msg.size(); i++){
std::cout << (buf[i] + 0) << ":"; //Never any errors
}
boost::asio::async_write(socket_, boost::asio::buffer(msg.getOutputBuffer(), msg.size()),boost::bind(&Session::handle_write, shared_from_this(), msg, boost::asio::placeholders::error));
}
else {
//Queue message
_msgqueue.push_back(msg);
}
}
传递给async_write
的缓冲区需要在整个操作期间有效。这里的文档非常明确
包含要写入的数据的一个或多个缓冲区。虽然 缓冲区对象可以根据需要复制,底层的所有权 内存块由调用方保留,它必须保证 在调用处理程序之前,它们将保持有效。
您传递了一个指针,该指针在销毁NetworkMessage
对象时不再有效,我猜这是在async_write
操作完成之前。NetworkMessage
对象在传递给 handle_write()
完成处理程序时被复制。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 加速C++练习2.4
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 加速兽握手:sslv3 警报握手失败错误
- 加速进程间:管理共享内存错误
- 加速 ASIO 系统错误 995:I/O 操作已中止
- 为安卓构建带有错误"cannot find -lrt"的加速
- 使用加速进程间 1.60 发布版本时出现奇怪的链接器错误
- 双加速::绑定导致编译时错误
- C++服务器,System.10014 错误,使用加速
- C++:加速进程间内存映射文件错误