list / vector迭代器不可递增

时间:2015-12-13 14:22:47

标签: c++ list vector

所以我尝试使用visual studio Community 2015在c ++中迭代我的容器时遇到了问题 我正在尝试使用select()在Windows上编写服务器/客户端,我收到错误:

  

矢量迭代器不可递增

我没有调用vector :: erase()等,虽然我确实使用了vector :: push_back()

void MGKServer::mainLoop()
{
    MGKServerSocket *mgk;
    std::vector<User *> users;
    int             actual = 0;
    char            buffer[1024];

    mgk = new WindowsServerSocket();
    mgk->init("127.0.0.1", 4242, "TCP");

    int             sock = mgk->getSock();
    std::cout << "sock is: " << mgk->getSock() << std::endl;
    while (1)
    {
        this->setFd(sock, &users); // FD_ZERO(&_readfd) and FD_SET for each user's socket and the server socket
        std::cout << "there is currently " << users.size() << " user(s) connected" << std::endl;
        if (select(FD_SETSIZE + 1, &this->_readfd, NULL, NULL, NULL) == -1)
            exit(errno);
        // When a user connects
        if (FD_ISSET(sock, &this->_readfd))
        {
            // addNewUser creates a pointer to an object User , set his socket to the given one and push it in the vector
            if (this->addNewUser(sock, &users) == -1)
                std::cout << "Can't add newUser" << std::endl; 
        }
        // When a user sends a message to the server
        else
        {
            int debug = 0;
            std::vector<User *>::iterator   it = users.begin();
            while (it != users.end())
            {
                if (it == users.end())
                    std::cout << "Test if something went wrong with iterations" << std::endl;
                if (FD_ISSET((*it)->getSocket(), &this->_readfd))
                {
                    // RecvUser will just call recv with the client socket and store the message in buffer.
                    int c = mgk->recvUser((*it)->getSocket(), buffer);
                    // Means the user disconnected so i close his socket
                    if (c == 0)
                    {
                        std::cout << "user with socket: " << (*it)->getSocket() << "disconnected" << std::endl;
                        closesocket((*it)->getSocket());
                    }
                    // Means he sends an instruction
                    else
                        std::cout << "ok" << std::endl;
                }
                std::cout << "Debug = " << debug << std::endl;
                ++debug;
                it++; // <- This small line seems to be the problem
            }
            std::cout << "Out of For loop" << std::endl;
        }
        std::cout << "found something on socket" << std::endl;
    }
}

这是我在addNewUser中做的事情:

int     MGKServer::addNewUser(int socket, std::vector<User *> *users)
{
    std::cout << "----NEW USER----" << std::endl;
    SOCKADDR_IN usin = { 0 };
    User        *u;
    int         size;
    int         usock;

    size = sizeof(usin);
    std::cout << "New user is trying to connect, socket is: ";
    usock = accept(socket, (SOCKADDR *)&usin, &size);
    if (usock == SOCKET_ERROR)
    {
        std::cout << "socket error occured" << std::endl;
        return (-1);
    }
    std::cout << usock << std::endl;
    FD_SET(usock, &this->_readfd);
    u = new User();
    u->setSocket(usock);
    users->push_back(u);
    return (0);
}

我的对象用户现在只包含一个带有get&amp; set方法的套接字。 我的MGKServerSocket只是windows / linux socket的一个例子。它包含初始化我的套接字和发送&amp;的基本功能。 recv数据给用户。

<小时/> 所以起初我有一个列表容器,但我有同样的错误。所以我转而尝试使用矢量,但没有任何改变 在开始时,我还使用了for循环而不是我当前的while循环,但是,再一次,没有任何改变。 我知道这个错误已经有很多问题了,但是他们通常在for循环中使用eraseinsert或者我不使用create the iterator when the list is empty所以我的问题是,为什么我会收到此错误?

0 个答案:

没有答案