int UDPManager::sendDatagram(const char * data, int length, unsigned long ipAddress, unsigned long port, unsigned long frameCount) { if (initErrors || data == NULL || length == 0 || port == 0) return -1; sockaddr_in otherAddress; otherAddress.sin_family = AF_INET; otherAddress.sin_addr.s_addr = ipAddress; otherAddress.sin_port = port; DataBuffer * sendBuffer = new DataBuffer(length + 4); //sendBuffer->copy(0, &length, sizeof(int)); sendBuffer->copy(0, &frameCount, 4); sendBuffer->copy(4, data, length); if (sendto(sock, sendBuffer->getData(), sendBuffer->getSize(), 0, (struct sockaddr *)&otherAddress, sizeof(otherAddress)) < 0) { perror("UDP sendto() failed\n"); delete sendBuffer; return -1; } //printf("UDP Send:"); //Utilities::printfNetworkPacket(sendBuffer->getData(), sendBuffer->getSize()); delete sendBuffer; return 0; }
int Server::synchClient(int clientID) { //aquireClientsMutex(clientID); //Clear Objects DataBuffer * temp = NetworkFunctions::createClearObjectsBuffer(); clients[clientID]->pushSendData(temp->getData(), temp->getSize()); delete temp; //Add Existing Objects for (list<pair<unsigned long, GameObject*>>::iterator iter = gameObjects->begin(); iter != gameObjects->end(); iter++) { temp = NetworkFunctions::createCreateObjectBuffer(iter->second); clients[clientID]->pushSendData(temp->getData(), temp->getSize()); delete temp; } /*for (int i = 0; i < gameObjects->size(); i++) { temp = NetworkFunctions::createCreateObjectBuffer(gameObjects->at(i)); clients[clientID]->pushSendData(temp->getData(), temp->getSize()); delete temp; }*/ for (int i = 0; i < playerObjects->size(); i++) { if (playerObjects->at(i) != NULL) { //Add All Existing Spells to players /*for (int elementIndex = 0; elementIndex < 5; elementIndex++) { for (int subIndex = 0; subIndex < playerObjects->at(i)->getSpells()[elementIndex].size(); subIndex++) { Spell * tempSpell = playerObjects->at(i)->getSpell(elementIndex, subIndex); if (tempSpell != NULL) { temp = NetworkFunctions::createAddSpellBuffer(clientID, elementIndex, tempSpell->getSpellID()); clients[clientID]->pushSendData(temp->getData(), temp->getSize()); } } }*/ //Change Spell to active one int currentElementIndex, currentSubIndex; playerObjects->at(i)->getActiveSpellIndices(¤tElementIndex, ¤tSubIndex); temp = NetworkFunctions::createChangeSpellBuffer(i, currentElementIndex, currentSubIndex); clients[clientID]->pushSendData(temp->getData(), temp->getSize()); } } //send all the items to create //releaseClientsMutex(clientID); return 0; }
// --------------------------------------------- void testSocket(string ip, unsigned short port) { Socket* socket = new Socket("null", 0); Socket::InetAddressPort remoteAddrAndPort; remoteAddrAndPort.port = port; Socket::getSockaddrByIpAndPort(&remoteAddrAndPort.addr, ip, port); socket->makeNonBlocking(); while (true) { bool result = socket->connect(remoteAddrAndPort); if (result) { cout << "connect success!" << endl; cm::Thread::sleep(100); char sendData[] = "TCP client request"; int numberOfBytesSent; if (SKT_SUCC == socket->send(sendData, strlen(sendData), numberOfBytesSent)) { assert(numberOfBytesSent == strlen(sendData)); cout << "send " << numberOfBytesSent << " bytes data complete" << endl; DataBuffer* response = new DataBuffer(); int numOfBytesRecved = 0; while (true) { result = socket->recv(response->getEndOfDataPointer(), response->getSize() - response->getLength(), numOfBytesRecved); assert(result != SKT_ERR); if (result == SKT_SUCC) { assert(numOfBytesRecved != 0); response->increaseDataLength(numOfBytesRecved); cout << "recv " << numOfBytesRecved << " bytes data: " << response->getData() << endl; response->reset(); break; } else { cm::Thread::sleep(1); } } } socket->close(); break; } else { cm::Thread::sleep(1); } } }
DataBuffer * UDPManager::recvDatagram(sockaddr_in ** originAddress) { if (initErrors) return NULL; struct timeval timeout; struct fd_set fds; timeout.tv_sec = 0; timeout.tv_usec = 0; FD_ZERO(&fds); FD_SET(sock, &fds); int selectValue = select(0, &fds, 0, 0, &timeout); if (selectValue > 0) { DataBuffer * receiveBuffer = new DataBuffer(MAX_PACKET_SIZE); sockaddr_in * recvAddress = new sockaddr_in(); int recvBufferSize = MAX_PACKET_SIZE; int returnValue = recvfrom(sock, receiveBuffer->getData(), MAX_PACKET_SIZE, 0, (struct sockaddr *)recvAddress, &recvBufferSize); if (returnValue == SOCKET_ERROR) { printf("recvfrom() failed: %d\n", WSAGetLastError()); delete receiveBuffer; return NULL; } receiveBuffer->setSize(returnValue); if (originAddress == NULL) delete recvAddress; else *originAddress = recvAddress; //printf("UDP Rec:"); //Utilities::printfNetworkPacket(receiveBuffer->getData(), receiveBuffer->getSize()); //check that data was sent from client? return receiveBuffer; } else if (selectValue < 0) printf("Error polling for UDP Data\n"); return NULL; }
int Server::run(const char * ini) { readServerData(ini); //clients = new Client[maxPlayers]; clients = vector<Client*>(); clients.reserve(maxPlayers); for (int i = 0; i < maxPlayers; i++) { clients.push_back(new Client()); clients[i]->setID(i); } double elapsedTime = 0.0; double timePerFrame = 1000.0 / updateRate; double timePerRenderFrame = 1000.0 / renderRefreshRate; static double timeSinceLastRender = 0.0; long lastTime = 0; double targetSleep = 0.0; double sleepRemainder = 0.0; double startSleep = 0.0; double sleepTime = 0.0; loadConfig(); initSDL(); initGlew(); initBullet(); initGLContexts(); initObjects(); running = true; HANDLE listenThreadHandle = HostListener::start(); loadResources(); loadLevel("asdf"); while (running) { frameCount++; if (GetAsyncKeyState(VK_ESCAPE) && (GetForegroundWindow() == consoleWindow) && MessageBox(0, "Shutdown the Server?", "Rune Server Shutdown", MB_YESNO) == IDYES) break; lastTime = lastTime = SDL_GetTicks(); serverEventsTCP->clearSendBuffer(); serverEventsTCP->clearReceiveBuffer(); serverEventsUDP->clearSendBuffer(); serverEventsUDP->clearReceiveBuffer(); //Get all commands from clients for (int i = 0; i < maxPlayers; i++) { DataBuffer * temp; aquireClientsMutex(i); temp = clients[i]->popReceiveData(); if (!clients[i]->isConnected() && playerObjects->at(i) != NULL) { int index = -1; int x = 0; for (list<pair<unsigned long, GameObject*>>::iterator iter = gameObjects->begin(); iter != gameObjects->end(); iter++) { if (playerObjects->at(i) == iter->second) { index = x; break; } x++; } /*for (int x = 0; x < gameObjects->size(); x++) { if (playerObjects->at(i) == gameObjects->at(x)) index = x; }*/ gameObjects->remove(playerObjects->at(i)->getNetID()); delete playerObjects->at(i); playerObjects->at(i) = NULL; //gameObjects->erase(gameObjects->begin() + index); serverEventsTCP->appendToSendBuffer(NetworkFunctions::createDeleteObjectBuffer(index)); } releaseClientsMutex(i); serverEventsTCP->appendToReceiveBuffer(temp); } //Receive All UDP Events sockaddr_in * originAddress = NULL; DataBuffer * udpBuffer = UDPManager::recvDatagram(&originAddress); while (udpBuffer != NULL) { //origin Address matches client address? unsigned long packetFrameCount = 0; memcpy(&packetFrameCount, udpBuffer->getData(), 4); int clientID = getClientIDByAddress(originAddress->sin_addr.s_addr, originAddress->sin_port); if (clientID == -1) { int asdfadsfasdf = 123123; } else { //compare clientFrameCount to client->frameCount unsigned long clientFrameCount; aquireClientsMutex(clientID); clientFrameCount = clients[clientID]->getFrameCount(); releaseClientsMutex(clientID); if (packetFrameCount < clientFrameCount) { //discard printf("Packet from Client %d discarded\n", clientID); } else { serverEventsUDP->appendToReceiveBuffer(udpBuffer->getData() + 4, udpBuffer->getSize() - 4); aquireClientsMutex(clientID); clients[clientID]->setFrameCount(packetFrameCount); releaseClientsMutex(clientID); } } delete udpBuffer; udpBuffer = NULL; delete originAddress; originAddress = NULL; udpBuffer = UDPManager::recvDatagram(&originAddress); } NetworkFunctions::translateReceivedEvents(serverEventsTCP); NetworkFunctions::translateReceivedEvents(serverEventsUDP); //Execute my own gamelogic commands SDL_Event e; while (SDL_PollEvent(&e)) { if (e.key.keysym.sym == SDLK_ESCAPE) running = false; if (e.key.keysym.sym == SDLK_m) { ((RigidObject*)gameObjects->getValue(2))->setPosition(5, 10, 0); ((RigidObject*)gameObjects->getValue(3))->setPosition(0, 10, 0); ((RigidObject*)gameObjects->getValue(4))->setPosition(-5, 10, 0); ((RigidObject*)gameObjects->getValue(2))->setVelocity(0, 0, 0); ((RigidObject*)gameObjects->getValue(3))->setVelocity(0, 0, 0); ((RigidObject*)gameObjects->getValue(4))->setVelocity(0, 0, 0); ((RigidObject*)gameObjects->getValue(2))->setGravity(0, -9.81f*4.0f, 0); ((RigidObject*)gameObjects->getValue(3))->setGravity(0, -9.81f*4.0f, 0); ((RigidObject*)gameObjects->getValue(4))->setGravity(0, -9.81f*4.0f, 0); printf("reset boxes\n"); } } //if (update((long)(elapsedTime + sleepTime)) == -1) break; //dynamicsWorld->stepSimulation((float)(elapsedTime + sleepTime)*0.001f, 50, (float)(elapsedTime + sleepTime)*0.001f); dynamicsWorld->stepSimulation(1.0f / 64.0f, 100, 1.0f / 64.0f); //1.0f/(float)Settings::getMaxFPS()); list<pair<unsigned long, GameObject*>>::iterator iter = gameObjects->begin(); while (iter != gameObjects->end()) { iter->second->update(elapsedTime); if (!iter->second->isAlive()) { serverEventsTCP->appendToSendBuffer(NetworkFunctions::createDeleteObjectBuffer(iter->second->getNetID())); for (int p = 0; p < maxPlayers; p++) { if (playerObjects->at(p) != NULL && playerObjects->at(p) == iter->second) { playerObjects->at(p) = NULL; } } GameObject * tempObject = iter->second; iter = gameObjects->erase(iter); delete tempObject; } else iter++; } /*for (list<pair<unsigned long, GameObject*>>::iterator iter = gameObjects->begin(); iter != gameObjects->end(); iter++) { iter->second->update(elapsedTime); if (!iter->second->isAlive()) { serverEventsTCP->appendToSendBuffer(NetworkFunctions::createDeleteObjectBuffer(iter->second->getNetID())); for (int p = 0; p < maxPlayers; p++) { if (playerObjects->at(p) != NULL && playerObjects->at(p) == iter->second) { playerObjects->at(p) = NULL; } } gameObjects->remove(iter->first, iter->second); delete (*gameObjects)[i]; gameObjects->erase(gameObjects->begin() + i); i--; } }*/ /*for (int i = 0; i < (int)gameObjects->size(); i++) { (*gameObjects)[i]->update(elapsedTime); if (!(*gameObjects)[i]->isAlive()) { serverEventsTCP->appendToSendBuffer(NetworkFunctions::createDeleteObjectBuffer(i)); for (int p = 0; p < maxPlayers; p++) { if (playerObjects->at(p) != NULL && playerObjects->at(p) == (*gameObjects)[i]) { playerObjects->at(p) = NULL; } } delete (*gameObjects)[i]; gameObjects->erase(gameObjects->begin() + i); i--; } }*/ //Update each client //for (int i = 0; i < gameObjects->size(); i++) // serverEvents->appendToSendBuffer(NetworkFunctions::createUpdateObjectBuffer(i)); for (int i = 0; i < maxPlayers; i++) { aquireClientsMutex(i); if (clients[i]->isConnected()) { if (clients[i]->requiresSynch()) { synchClient(i); clients[i]->setSynch(false); } else { clients[i]->pushSendData(serverEventsTCP->getSendBuffer(), serverEventsTCP->getSendBufferSize()); } } releaseClientsMutex(i); } for (int i = 0; i < maxPlayers; i++) { aquireClientsMutex(i); if (clients[i]->isConnected()) { //unsigned long clientPortUDP = clients[i]->getPortUDP(); if (!clients[i]->requiresSynch()) { serverEventsUDP->clearSendBuffer(); for (list<pair<unsigned long, GameObject*>>::iterator iter = gameObjects->begin(); iter != gameObjects->end(); iter++) { if (playerObjects->at(i) != iter->second /* && dont force player */) { DataBuffer * temp = NetworkFunctions::createUpdateObjectBuffer(iter->second->getNetID()); serverEventsUDP->appendToSendBuffer(temp); } } UDPManager::sendDatagram(serverEventsUDP->getSendBuffer(), serverEventsUDP->getSendBufferSize(), clients[i]->getIPAddress(), clients[i]->getPortUDP(), frameCount); } } releaseClientsMutex(i); } /*timeSinceLastRender += elapsedTime; if (timeSinceLastRender >= timePerRenderFrame) { timeSinceLastRender = 0.0; renderFrame(); }*/ renderFrame(); //Update Rate Calculations //Framerate Limit Calculations elapsedTime = SDL_GetTicks() - lastTime; targetSleep = timePerFrame - elapsedTime + sleepRemainder; if (targetSleep > 0) sleepRemainder = targetSleep - (Uint32)targetSleep; //Sleep(1000.0 / 64.0); startSleep = SDL_GetTicks(); while ((Uint32)(startSleep + targetSleep) > SDL_GetTicks()); sleepTime = SDL_GetTicks() - startSleep; } cout << "Shutting Down\n"; HostThread::stopAll(); HostListener::stop(); UDPManager::cleanup(); WSACleanup(); WaitForSingleObject(listenThreadHandle, INFINITE); saveConfig(); cleanupObjects(); //saveConfig(); killBullet(); //delete [] clients; return 0; }
void HttpRequestAndResponsePacketTF::testDecodeAndEncode() { HttpRequestPacket *request = new HttpRequestPacket; HttpResponsePacket *response; DataBuffer output; DataBuffer input; PacketHeader header; // http_load -r 1 -f 2 url char s1[] = "GET / HTTP/1.0\r\n" "Host: localhost\r\n" "User-Agent: http_load 12mar2006\r\n\r\n"; header._dataLen = sizeof(s1)-1; input.writeBytes(s1, sizeof(s1) - 1); CPPUNIT_ASSERT(request->decode(&input, &header)); CPPUNIT_ASSERT_EQUAL(1, request->_method); CPPUNIT_ASSERT_EQUAL(1, request->_version); CPPUNIT_ASSERT_EQUAL(false, request->isKeepAlive()); CPPUNIT_ASSERT(strcmp("localhost", request->findHeader("Host")) == 0); CPPUNIT_ASSERT(request->findHeader("User-Agent")); CPPUNIT_ASSERT(strcmp("http_load 12mar2006", request->findHeader("User-Agent")) == 0); response = doReply(request); response->encode(&output); char r1[] = "HTTP/1.1 200 OK\r\n" "Connection: close\r\n" "Content-Type: text/html\r\n" "Content-Length: 1\r\n\r\n/"; CPPUNIT_ASSERT(strncmp(r1, output.getData(), sizeof(r1) - 1) == 0); output.clear(); delete response; request->free(); request = new HttpRequestPacket; //fbench -q url -c 0 -n 15 -k -s 10 localhost 12345 request->_isKeepAlive = true; char s2[] = "GET http://localhost:12345?name=huang&jj=yy HTTP/1.1\r\n" "Host: localhost\r\n" "User-Agent: fbench/0.9\r\n\r\n"; header._dataLen = sizeof(s2)-1; input.writeBytes(s2, sizeof(s2) - 1); CPPUNIT_ASSERT(request->decode(&input, &header)); CPPUNIT_ASSERT_EQUAL(1, request->_method); CPPUNIT_ASSERT_EQUAL(2, request->_version); CPPUNIT_ASSERT_EQUAL(true, request->isKeepAlive()); CPPUNIT_ASSERT(strcmp("localhost", request->findHeader("Host")) == 0); CPPUNIT_ASSERT(strcmp("fbench/0.9", request->findHeader("User-Agent")) == 0); CPPUNIT_ASSERT(strcmp(request->getQuery(), "http://localhost:12345?name=huang&jj=yy") == 0); response = doReply(request); response->encode(&output); char r2[] = "HTTP/1.1 200 OK\r\n" "Connection: Keep-Alive\r\n" "Keep-Alive: timeout=10, max=10\r\n" "Content-Type: text/html\r\n" "Content-Length: 39\r\n\r\n" "http://localhost:12345?name=huang&jj=yy"; CPPUNIT_ASSERT(strncmp(r2, output.getData(), sizeof(r2) - 1) == 0); output.clear(); delete response; request->free(); request = new HttpRequestPacket; //fbench -q url -c 0 -n 15 -s 10 localhost 12345 char s3[] = "GET http://localhost:12345?name=huang&jj=yy HTTP/1.1\r\n" "Host: localhost\r\n" "Connection: close\r\n" "User-Agent: fbench/0.9\r\n\r\n"; header._dataLen = sizeof(s3)-1; input.writeBytes(s3, sizeof(s3) - 1); CPPUNIT_ASSERT(request->decode(&input, &header)); CPPUNIT_ASSERT_EQUAL(1, request->_method); CPPUNIT_ASSERT_EQUAL(2, request->_version); CPPUNIT_ASSERT_EQUAL(false, request->isKeepAlive()); CPPUNIT_ASSERT(strcmp("localhost", request->findHeader("Host")) == 0); CPPUNIT_ASSERT(strcmp("fbench/0.9", request->findHeader("User-Agent")) == 0); CPPUNIT_ASSERT(strcmp(request->getQuery(), "http://localhost:12345?name=huang&jj=yy") == 0); response = doReply(request); response->encode(&output); char r3[] = "HTTP/1.1 200 OK\r\n" "Connection: close\r\n" "Content-Type: text/html\r\n" "Content-Length: 39\r\n\r\n" "http://localhost:12345?name=huang&jj=yytp://localhost:12345?name=huang&jj=yy"; CPPUNIT_ASSERT(strncmp(r3, output.getData(), sizeof(r3) - 1) == 0); output.clear(); delete response; request->free(); request = new HttpRequestPacket; //firefox request->_isKeepAlive = true; char s4[] ="GET /?name=huang&jj=yy HTTP/1.0\r\n" "Host: localhost:12345\r\n" "User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b5) Gecko/2008042803 Red Hat/3.0b5-0.beta5.6.el5 Firefox/3.0b5\r\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" "Accept-Language: en-us,en;q=0.5\r\n" "Accept-Encoding: gzip,deflate\r\n" "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" "Keep-Alive: 300\r\n" "Connection: keep-alive\r\n\r\n"; header._dataLen = sizeof(s4)-1; input.writeBytes(s4, sizeof(s4) - 1); CPPUNIT_ASSERT(request->decode(&input, &header)); CPPUNIT_ASSERT_EQUAL(1, request->_method); CPPUNIT_ASSERT_EQUAL(1, request->_version); CPPUNIT_ASSERT_EQUAL(true, request->isKeepAlive()); CPPUNIT_ASSERT(strcmp("localhost:12345", request->findHeader("Host")) == 0); CPPUNIT_ASSERT(strcmp("Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b5) Gecko/2008042803 Red Hat/3.0b5-0.beta5.6.el5 Firefox/3.0b5", request->findHeader("User-Agent")) == 0); CPPUNIT_ASSERT(strcmp(request->getQuery(), "/?name=huang&jj=yy") == 0); response = doReply(request); response->encode(&output); char r4[] = "HTTP/1.1 200 OK\r\n" "Connection: Keep-Alive\r\n" "Keep-Alive: timeout=10, max=10\r\n" "Content-Type: text/html\r\n" "Content-Length: 18\r\n\r\n" "/?name=huang&jj=yy2345?name=huang&jj=yy"; CPPUNIT_ASSERT(strncmp(r4, output.getData(), sizeof(r4) - 1) == 0); output.clear(); delete response; request->free(); request = new HttpRequestPacket; // http_load -r 1 -f 2 url keep-alive:true request->_isKeepAlive = true; char s5[] = "GET / HTTP/1.0\r\n" "Host: localhost\r\n" "Connection: keep-alive\r\n" "User-Agent: http_load 12mar2006\r\n\r\n"; header._dataLen = sizeof(s5)-1; input.writeBytes(s5, sizeof(s5) - 1); CPPUNIT_ASSERT(request->decode(&input, &header)); CPPUNIT_ASSERT_EQUAL(1, request->_method); CPPUNIT_ASSERT_EQUAL(1, request->_version); CPPUNIT_ASSERT_EQUAL(true, request->isKeepAlive()); CPPUNIT_ASSERT(strcmp("localhost", request->findHeader("Host")) == 0); CPPUNIT_ASSERT(request->findHeader("User-Agent")); CPPUNIT_ASSERT(strcmp("http_load 12mar2006", request->findHeader("User-Agent")) == 0); response = doReply(request); response->encode(&output); cout<<output.getData(); char r5[] = "HTTP/1.1 200 OK\r\n" "Connection: Keep-Alive\r\n" "Keep-Alive: timeout=10, max=10\r\n" "Content-Type: text/html\r\n" "Content-Length: 1\r\n\r\n" "//?name=huang&jj=yy2345?name=huang&jj=yy"; CPPUNIT_ASSERT(strncmp(r5, output.getData(), sizeof(r5) - 1) == 0); output.clear(); delete response; request->free(); request = new HttpRequestPacket; //wrong query request->_isKeepAlive = true; char s6[] = "GET HTTP/1.0\r\n" "Host: localhost\r\n" "Connection: keep-alive\r\n"; header._dataLen = sizeof(s6)-1; input.writeBytes(s6, sizeof(s6) - 1); CPPUNIT_ASSERT(!request->decode(&input, &header)); request->free(); }
int NetworkFunctions::translateReceivedEvents(Packet * serverEvents) { while (serverEvents->getReceiveBufferSize() > 0) { DataBuffer * tempBuffer = new DataBuffer(MAX_PACKET_SIZE); int charCount = 0; int functionIndex = -1; int bufferLength = -1; for (int i = 0; i < serverEvents->getReceiveBufferSize(); i++) { tempBuffer->copy(tempBuffer->getSize(), serverEvents->getReceiveBuffer() + i, 1); if (charCount == 3) { memcpy(&functionIndex, tempBuffer->getData(), 4); if (functionIndex < 0 || functionIndex >= FUNCTION_COUNT || functionIndex == 10) { while ((serverEvents->getReceiveBuffer()[i]) != '\n') i++; tempBuffer->clear(); continue; } else { bufferLength = bufferSizes[functionIndex]; } } if (charCount == 7 && functionIndex == EVENT_UPDATE_GAME_OBJECT) { unsigned long netID = 0; memcpy(&netID, tempBuffer->getData() + 4, 4); GameObject * tempObject = gameObjects->getValue(netID); if (tempObject == NULL) { while ((serverEvents->getReceiveBuffer()[i]) != '\n') i++; tempBuffer->clear(); continue; } /*int objectIndex = -1; memcpy(&objectIndex, tempBuffer->getData() + 4, 4); if (objectIndex < 0 || objectIndex >= gameObjects->size()) { while ((serverEvents->getReceiveBuffer()[i]) != '\n') i++; tempBuffer->clear(); continue; }*/ else { bufferLength = tempObject->getSerializedSize(); } } if (charCount == bufferLength-1) { if (tempBuffer->getSize() == 0) { tempBuffer->clear(); continue; } executeIndexedFunction(tempBuffer); tempBuffer->clear(); charCount = 0; continue; } /*if (serverEvents->getReceiveBuffer()[i] == '\n') { if (tempBuffer->getSize() == 0) { tempBuffer->clear(); continue; } executeIndexedFunction(tempBuffer); tempBuffer->clear(); }*/ charCount++; } delete tempBuffer; serverEvents->refillReceiveBuffer(); } return 0; }
void TCPCONNECTIONTF::testReadData() { ANET_LOG(DEBUG, "BEGIN testReadData()"); Socket *client = new Socket; client->setAddress("localhost", 12345); client->connect(); Socket *accept = _server->accept(); CPPUNIT_ASSERT(accept); // ConnPacketFactory *factory = new ConnPacketFactory; // DefaultPacketStreamer *streamer = new DefaultPacketStreamer(factory); //tricket 47 TCPConnection *tmpConn = new TCPConnection(accept, _streamer, NULL); DataBuffer buffer; buffer.writeInt32(ANET_PACKET_FLAG + 1); buffer.writeInt32(111); buffer.writeInt32(222); const char *data = "just for test"; buffer.writeInt32(strlen(data) - 1); buffer.writeBytes(data, strlen(data)); ANET_LOG(DEBUG, "buffer(%p) length:(%d)",&buffer, buffer.getDataLen()); client->write(buffer.getData(), buffer.getDataLen()); CPPUNIT_ASSERT(!tmpConn->readData()); buffer.clear(); buffer.writeInt32(ANET_PACKET_FLAG); buffer.writeInt32(111); buffer.writeInt32(222); buffer.writeInt32(-1); buffer.writeBytes(data, strlen(data)); client->write(buffer.getData(), buffer.getDataLen()); CPPUNIT_ASSERT(!tmpConn->readData()); buffer.clear(); buffer.writeInt32(ANET_PACKET_FLAG); buffer.writeInt32(111); buffer.writeInt32(222); buffer.writeInt32(strlen(data)/2); buffer.writeBytes(data, strlen(data)); client->write(buffer.getData(), buffer.getDataLen()); CPPUNIT_ASSERT(!tmpConn->readData()); delete tmpConn; delete accept; client->close(); delete client; // TCPConnection *conn = new TCPConnection(_client, NULL, NULL); _conn->setServer(false); _conn->postPacket(new ConnPacket(11), _handler, NULL); _conn->postPacket(new ConnPacket(21), _handler, NULL); _conn->postPacket(new ConnPacket(31), _handler, NULL); _conn->writeData(); // flag(0x416e457) chid pcode datalen //DataBuffer *input = &_conn->_input; TCPServerAdapter *adapter = new TCPServerAdapter; TCPConnection *connAcc = new TCPConnection(_accept, _streamer, adapter); connAcc->setServer(true); connAcc->_streamer = _streamer; connAcc->_iocomponent = new TCPComponent(_transport, _accept); //connAcc->_streamer, NULL); CPPUNIT_ASSERT(connAcc->readData()); CPPUNIT_ASSERT_EQUAL(3, adapter->handNum); //test error packet adapter->reset(); //set the hand packet num to zero _conn->postPacket(new ConnPacket(20, 11), _handler, NULL); _conn->postPacket(new ConnPacket(20, 30), _handler, NULL); CPPUNIT_ASSERT(_conn->writeData()); CPPUNIT_ASSERT(connAcc->readData()); CPPUNIT_ASSERT_EQUAL(2, adapter->handNum); ANET_LOG(SPAM, "connAcc(%p), ioc (%p)", connAcc, connAcc->_iocomponent); delete connAcc->_iocomponent; delete connAcc; _accept = NULL; delete adapter; ANET_LOG(DEBUG,"END testReadData()"); }