2016-06-11 114 views
-2

我在我的代碼中有這個錯誤,這裏是代碼: `錯誤C2678:二進制'==':找不到操作符,它需要類型'std :: pair <const _Kty,_Ty>'的左側操作數'

#pragma once 
#include <WinSock2.h> 
#include <Windows.h> 
#include "TriviaServer.h" 
#include "Validator.h" 
#define PORT 8820 
#define IFACE 0 
#include <algorithm> 
using namespace std; 

TriviaServer::TriviaServer() 
{ 
    _roomIdSequence = 0; 
    _socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (_socket == INVALID_SOCKET) 
     throw std::exception(__FUNCTION__ " - socket"); 
    /*DataBase Build*/ 
} 

TriviaServer::~TriviaServer() 
{ 
    map<int, Room*>::iterator it = _roomsList.begin(); 
    for (it; it != _roomsList.end(); it++) 
    { 
     delete it->second; 
    } 
    map<SOCKET, User*>::iterator it2 = _connectedUsers.begin(); 
    for (it2; it2 != _connectedUsers.end(); it2++) 
    { 
     delete it2->second; 
     closesocket(it2->first); 
    } 
    closesocket(_socket); 
} 

void TriviaServer::server() 
{ 
    bindAndListen(); 
    thread handleMessages(&TriviaServer::handleRecievedMessages); 
    handleMessages.detach(); 
    while (true) 
    { 
     cout << "accepting client..." << endl; 
     accept(); 
    } 
} 

void TriviaServer::bindAndListen() 
{ 
    struct sockaddr_in sa = { 0 }; 
    sa.sin_port = htons(PORT); 
    sa.sin_family = AF_INET; 
    sa.sin_addr.s_addr = IFACE; 
    if (::bind(_socket, (struct sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR) 
     throw std::exception(__FUNCTION__ " - bind"); 
    cout << "binded" << endl; 

    if (::listen(_socket, SOMAXCONN) == SOCKET_ERROR) 
     throw std::exception(__FUNCTION__ " - listen"); 
    cout << "listening..." << endl; 
} 

void TriviaServer::accept() 
{ 
    SOCKET client_socket = ::accept(_socket, NULL, NULL); 
    if (client_socket == INVALID_SOCKET) 
     throw std::exception(__FUNCTION__); 

    cout << "Client accepted !" << endl; 
    // create new thread for client and detach from it 
    std::thread tr(&TriviaServer::clientHandler, this, client_socket); 
    tr.detach(); 
} 

void TriviaServer::clientHandler(SOCKET s) 
{ 
    bool clientConnected = true; 
    while (clientConnected) 
    { 
     int code = Helper::getMessageTypeCode(s); 
     RecievedMessage* m = buildRecieveMessage(s, code); 
     addRecievedMessage(m); 
    } 
} 

void TriviaServer::safeDeleteUser(RecievedMessage* m) 
{ 
    try 
    { 
     SOCKET soc = m->getSock(); 
     handleSignout(m); 
     if (soc != NULL) 
     { 
      closesocket(soc); 
     } 
    } 
    catch (...) 
    { } 
} 

void TriviaServer::addRecievedMessage(RecievedMessage* m) 
{ 
    std::unique_lock<std::mutex> locker(_mtxRecievedMessages); 
    m->setUser(getUserBySocket(m->getSock())); 
    locker.lock(); 
    _queRcvMessages.push(m);  
    locker.unlock(); 
    _cond.notify_one(); 

} 

RecievedMessage* TriviaServer::buildRecieveMessage(SOCKET s, int code) 
{ 
    vector<string> values; 
    int len; 
    switch (code) 
    { 
    case SIGN_IN_REQUEST: 
     for (int i = 0; i < 2; i++) 
     { 
      len = Helper::getIntPartFromSocket(s, 2); 
      values.push_back(Helper::getStringPartFromSocket(s, len)); 
     } 
     break; 
    case SIGN_OUT_REQUEST: 
     break; 
    case SIGN_UP_REQUEST: 
     for (int i = 0; i < 3; i++) 
     { 
      len = Helper::getIntPartFromSocket(s, 2); 
      values.push_back(Helper::getStringPartFromSocket(s, len)); 
     } 
     break; 
    case AVAILABLE_ROOM_REQUEST: 
     break; 
    case ROOM_USERS_REQUEST: 
    case ROOM_JOIN_REQUEST: 
     values.push_back(Helper::getStringPartFromSocket(s, 4)); 
     break; 
    case ROOM_LEAVE_REQUEST: 
     break; 
    case ROOM_CREATE_REQUEST: 
     len = Helper::getIntPartFromSocket(s, 2); 
     values.push_back(Helper::getStringPartFromSocket(s, len)); 
     values.push_back(Helper::getStringPartFromSocket(s, 1)); 
     values.push_back(Helper::getStringPartFromSocket(s, 2)); 
     values.push_back(Helper::getStringPartFromSocket(s, 2)); 
     break; 
    case ROOM_CLOSE_REQUEST: 
     break; 
    case EXIT_APPLICATION: 
     break; 
    } 

    RecievedMessage* m; 
    if (!values.empty()) 
    { 
     m = new RecievedMessage(s, code, values); 
    } 
    else 
    { 
     m = new RecievedMessage(s, code); 
    } 
    return m; 
} 
void TriviaServer::handleRecievedMessages() 
{ 
    std::unique_lock<std::mutex> locker(_mtxRecievedMessages); 
    while (true) 
    { 
     if (_queRcvMessages.empty()) 
     { 
      _cond.wait(locker); 
     } 
     switch (_queRcvMessages.front()->getMessageCode()) 
     { 
     case SIGN_IN_REQUEST: 
      handleSignin(_queRcvMessages.front()); 
      break; 
     case SIGN_OUT_REQUEST: 
      handleSignout(_queRcvMessages.front()); 
      break; 
     case SIGN_UP_REQUEST: 
      handleSignup(_queRcvMessages.front()); 
      break; 
     case AVAILABLE_ROOM_REQUEST: 
      handleGetRooms(_queRcvMessages.front()); 
      break; 
     case ROOM_USERS_REQUEST: 
      handleGetUsersInRoom(_queRcvMessages.front()); 
      break; 
     case ROOM_JOIN_REQUEST: 
      handleJoinRoom(_queRcvMessages.front()); 
      break; 
     case ROOM_LEAVE_REQUEST: 
      handleLeaveRoom(_queRcvMessages.front()); 
      break; 
     case ROOM_CREATE_REQUEST: 
      handleCreateRoom(_queRcvMessages.front()); 
      break; 
     case ROOM_CLOSE_REQUEST: 
      handleCloseRoom(_queRcvMessages.front()); 
      break; 
     case EXIT_APPLICATION: 
      handleSignout(_queRcvMessages.front()); 
      break; 
     } 
     _queRcvMessages.pop(); 
    } 
} 

User* TriviaServer::getUserBySocket(SOCKET s) 
{ 
    std::map<SOCKET, User*>::iterator it; 
    it = find(_connectedUsers.begin(), _connectedUsers.end(), s); 
    if (it != _connectedUsers.end()) 
    { 
     return it->second; 
    } 
    else 
    { 
     return NULL; 
    } 
} 

User* TriviaServer::handleSignin(RecievedMessage* m) 
{ 
    int flag = true; // if wrong details 
    map<string, string>::iterator it; 
    map<SOCKET,User*>::iterator itConnected; 
    User* login = nullptr; 
    for (it = _dbUsers.begin(); it != _dbUsers.end(); it++) 
    { 
     if ((it->first) == ((*(m->getValues()))[0]) && (it->second) == ((*(m->getValues()))[1])) 
     { 
      flag = false; 
      login = new User(it->first, m->getSock()); 
      for (itConnected = _connectedUsers.begin(); itConnected != _connectedUsers.end(); it++) 
      { 
       if (itConnected->second->getUsername() == login->getUsername()) 
       { 
        delete login; 
        login = nullptr; 
       } 
      } 
     } 
    } 

    if (login) 
    { 
     Helper::sendData(m->getSock(), to_string(SIGN_IN_SUCCESS)); 
    } 
    else if (flag) 
    { 
     Helper::sendData(m->getSock(), to_string(SIGN_IN_WRONG_DETAILS)); 

    } 
    else 
    { 
     Helper::sendData(m->getSock(), to_string(SIGN_IN_USER_CONNECTED)); 
    } 
    return login; 
} 

bool TriviaServer::handleSignup(RecievedMessage* m) 
{ 
    //[203##username##pass##email] 
    string user = (*m->getValues())[0]; 
    string pass = (*m->getValues())[1]; 
    string email = (*m->getValues())[2]; 

    if (!Validator::isPasswordValid(pass)) 
    { 
     Helper::sendData(m->getSock(), to_string(SIGN_UP_PASS_ILLEGAL)); 
     return false; 
    } 
    if (!Validator::isUsernameValid(user)) 
    { 
     Helper::sendData(m->getSock(), to_string(SIGN_UP_USERNAME_ILLEGAL)); 
     return false; 
    } 
    //////////////////// TEMP CODE 
    map<string, string>::iterator it = _dbUsers.begin(); 
    for (it; it != _dbUsers.end(); it++) 
    { 
     if (user == it->first) 
     { 
      Helper::sendData(m->getSock(), to_string(SIGN_UP_USERNAME_EXISTS)); 
      return false; 
     } 
    } 
    _dbUsers.insert(pair<string, string>(user, pass)); 
    //////////////////// END TEMP CODE 
    //////////////////// FUTURE CODE: 
    /*if (!DataBase::isUserExists(user)) 
    { 
    Helper::sendData(m->getSock(), to_string(SIGN_UP_USERNAME_EXISTS)); 
    return false; 
    } 
    if(!DataBase::addNewUser(user, pass, email)) 
    { 
    Helper::sendData(m->getSock(), to_string(SIGN_UP_OTHER)); 
    return false; 
    } 
    */ 
    Helper::sendData(m->getSock(), to_string(SIGN_UP_SUCCESS)); 
    return true; 
} 

void TriviaServer::handleSignout(RecievedMessage* m) 
{ 
    User* u; 
    if (u = m->getUser()) 
    { 
     map<SOCKET, User*>::iterator it = _connectedUsers.begin(); 
     for (it; it != _connectedUsers.end(); it++) 
     { 
      if (it->first == u->getSocket()) 
      { 
       delete it->second; 
       closesocket(it->first); 
      } 
     } 
     handleCloseRoom(m); 
     handleLeaveRoom(m); 
     //handleLeaveGame(m); 
    } 
} 

bool TriviaServer::handleCreateRoom(RecievedMessage* m) 
{ 
    User* curr = m->getUser(); 
    if (curr) 
    { 
     vector<string>* values = m->getValues(); 
     if (curr->createRoom(++_roomIdSequence, m->getUser(),(*values)[0] ,stoi((*values)[1], nullptr, 0), stoi((*values)[3], nullptr, 0), stoi((*values)[2], nullptr, 0))) 
     { 
      _roomsList.insert(pair<int, Room*>(_roomIdSequence, curr->getRoom())); 
      return true; 
     } 
     return false; 
    } 
    else 
    { 
     return false; 
    } 
} 
bool TriviaServer::handleCloseRoom(RecievedMessage* m) 
{ 

} 
bool TriviaServer::handleJoinRoom(RecievedMessage* m) 
{ 

} 
bool TriviaServer::handleLeaveRoom(RecievedMessage* m) 
{ 

} 
void TriviaServer::handleGetUsersInRoom(RecievedMessage* m) 
{ 

} 
void TriviaServer::handleGetRooms(RecievedMessage* m) 
{ 

} 

`

我試圖把意見在所有的「==」和「!=」搜索哪裏出了問題,但錯誤不斷顯示出來。

正是在這樣的cpp文件,據我可以從代碼告訴(我不能編譯的唯一文件)

感謝您的幫助, 遺憾的長碼, 奧馬爾

+2

你爲什麼要以這種奇怪的方式尋找錯誤的位置?每一個自我尊重的C++編譯器都會告訴你帶有錯誤的行號,並且每個自我尊重的文本編輯器都可以將光標定位在確切的行上。所以有什麼問題? –

+1

您還需要通過刪除所有不會導致錯誤的代碼來減少程序。 –

+0

您顯然正在使用Visual Studio。雙擊錯誤消息,它會告訴你它抱怨哪一行。 –

回答

0

問題是在其他頭,其中包括, 了包括順序應該是

#include <WinSock2.h> 
#include <Windows.h> 

,而不是周圍的其他方式!

+0

這並不能解釋問題。你的原始代碼按照這個順序。 –

+0

是的,但我包括「TriviaServer.h」,並在那裏我包括另一個頭使用這些包括,我包括在錯誤的順序 –

相關問題