Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++ C++;服务器,System.10014错误,正在使用Boost_C++_Networking_Boost_Boost Asio - Fatal编程技术网

C++ C++;服务器,System.10014错误,正在使用Boost

C++ C++;服务器,System.10014错误,正在使用Boost,c++,networking,boost,boost-asio,C++,Networking,Boost,Boost Asio,更新:我想出来了!有点我不确定这是怎么解决的,但确实解决了。而不是使用: NetworkMessage msg; msg.AddByte(0x01); sendmessage(msg); 我尝试了这个方法,效果很好(一些功能几乎没有变化) 这解决了问题,但仍希望任何人能解释一下为什么会发生这种情况。把它作为答案贴出来,这样我就可以标记它了。谢谢。 我一直在使用TCP服务器,但我遇到了一个小问题 有一个循环发送大约600?消息,一次发送1条(从队列消息列表中读取) 由于某种原因,大约有200个用

更新:我想出来了!有点我不确定这是怎么解决的,但确实解决了。而不是使用:

NetworkMessage msg;
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;
    }
}
此外,这似乎不相关,但如果我尝试将outputMessage更改为:

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;
    }
}
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));
}
无效句柄写入(NetworkMessage&msg,const boost::system::error\u代码和错误)
{
如果(错误)
{
cout
void outputMessage(NetworkMessage&msg,bool forceTrue=false)
{
如果(!connectionLocked | | forceTrue){
connectionLocked=true;

std::你能显示
NetworkMessage::getOutputBuffer
NetworkMessage::size
的代码吗?你能发布
NetworkMessage
的定义吗?我删除了一些“杂乱”的内容所以它看起来有点简单,但仅此而已。我从另一个项目中复制了一些:D至少名称。好的,我有一个小更新。当我收到错误时,我尝试打印邮件的内存地址。它与我发送的地址不同。让我详细说明:更新:我将编辑主帖子,在这里键入代码不起作用。修复它!不知道这到底是为什么修复了它。非常感谢你的解释,这样就不会再发生这种情况。更新了第一篇文章。
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;
    }
}
#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] = '\0';
            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
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);
    }
}