/** * cliToSrv - 从客户端向服务端转发数据 * * @hs [in] 操作数 * * return * ==0 正常,不需要关闭套接字 * <0 出错(包括有套接字关闭) */ int cliToSrv(SOCK_INFO &hs) { int ret; char *pSend = NULL; ret = recv(hs.sock, hs.buffer+MAX_HTTPHEAD_SIZE, MAX_IOBUFFER_LEN, 0); if(ret <= 0) return BUILD_ERROR(_OSerrno(), ECCLOSE); ret = buildHttpData(hs.buffer+MAX_HTTPHEAD_SIZE, ret, MAX_HTTPHEAD_SIZE, &pSend, hs.usUnitSerial, hs.ulLinkNo); if(ret < 0) return ret; ret = sendToPeer(hs.peerSock, pSend, ret); if(ret != 0) return BUILD_ERROR(_OSerrno(), ESCLOSE); return 0; }
void GameServer::handlePacket(sf::Packet& packet, Peer& peer, bool& detectedTimeout) { sf::Int32 packetType; packet >> packetType; switch (packetType) { case Packet::Login: { std::string username, password; packet >> username >> password; if (true) { peer.setName(username); ah::Application::instance() << "[Server] " + username + " joined the game"; { sf::Packet newPacket; newPacket << Packet::ClientJoined << username; sendToAll(newPacket); } std::vector<sf::Packet> packets; // packets loading for (std::size_t i = 0; i < packets.size(); i++) { sendToPeer(packets[i],peer); } } } break; case Packet::Disconnect: { peer.setTimedOut(true); detectedTimeout = true; } break; case Packet::ClientMessage: { Message rMsg; packet >> rMsg; if (rMsg.isCommand()) { // check permissions for the command // do the command Message msg; sf::Packet newPacket; newPacket << Packet::ServerMessage << msg; sendToPeer(newPacket,peer); } else if (!rMsg.isCommand()) { sf::Packet newPacket; newPacket << Packet::ServerMessage << rMsg; sendToAll(newPacket); ah::Application::instance() << rMsg.getEmitter() + " : " + rMsg.getContent(); } } default: break; } }