const SimulatorIMP& SimulatorIMP::execute(Algorithm alg) { try { init(); while (!finished()) { fillUpdateBuffer(); handleQueries(); evictFromUpdateBuffer(alg); //std::cout << totalSeenPostings << "\n"; } } catch (std::exception &e) { std::cerr << "Error: " << e.what() << std::endl; } return *this; }
int SocketLayer::RecvFrom( const SOCKET s, RakPeer *rakPeer, int *errorCode ) { int len; char data[ MAXIMUM_MTU_SIZE ]; sockaddr_in sa; const socklen_t len2 = sizeof( struct sockaddr_in ); sa.sin_family = AF_INET; #ifdef _DEBUG data[ 0 ] = 0; len = 0; sa.sin_addr.s_addr = 0; #endif if ( s == INVALID_SOCKET ) { *errorCode = SOCKET_ERROR; return SOCKET_ERROR; } len = recvfrom( s, data, MAXIMUM_MTU_SIZE, COMPATIBILITY_2_RECV_FROM_FLAGS, ( sockaddr* ) & sa, ( socklen_t* ) & len2 ); // if (len>0) // printf("Got packet on port %i\n",ntohs(sa.sin_port)); if ( len == 0 ) { #ifdef _DEBUG printf( "Error: recvfrom returned 0 on a connectionless blocking call\non port %i. This is a bug with Zone Alarm. Please turn off Zone Alarm.\n", ntohs( sa.sin_port ) ); assert( 0 ); #endif *errorCode = SOCKET_ERROR; return SOCKET_ERROR; } if ( len != SOCKET_ERROR ) { #ifndef RAKSAMP_CLIENT if(*reinterpret_cast<DWORD *>(data) == 'PMAS') { handleQueries(s, len2, sa, data); return 1; } unKyretardizeDatagram((unsigned char *)data, len, iPort, 0); #endif unsigned short portnum; portnum = ntohs( sa.sin_port ); //strcpy(ip, inet_ntoa(sa.sin_addr)); //if (strcmp(ip, "0.0.0.0")==0) // strcpy(ip, "127.0.0.1"); #ifndef RAKSAMP_CLIENT ProcessNetworkPacket( sa.sin_addr.s_addr, portnum, (char *)decrBuffer, len - 1, rakPeer ); #else ProcessNetworkPacket( sa.sin_addr.s_addr, portnum, data, len, rakPeer ); #endif return 1; } else { *errorCode = 0; #if defined(_WIN32) && !defined(_COMPATIBILITY_1) && defined(_DEBUG) DWORD dwIOError = WSAGetLastError(); if ( dwIOError == WSAEWOULDBLOCK ) { return SOCKET_ERROR; } if ( dwIOError == WSAECONNRESET ) { #if defined(_DEBUG) // printf( "A previous send operation resulted in an ICMP Port Unreachable message.\n" ); #endif unsigned short portnum=0; ProcessPortUnreachable(sa.sin_addr.s_addr, portnum, rakPeer); // *errorCode = dwIOError; return SOCKET_ERROR; } else { #if defined(_DEBUG) if ( dwIOError != WSAEINTR ) { LPVOID messageBuffer; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language ( LPTSTR ) & messageBuffer, 0, NULL ); // something has gone wrong here... printf( "recvfrom failed:Error code - %d\n%s", dwIOError, messageBuffer ); //Free the buffer. LocalFree( messageBuffer ); } #endif } #endif } return 0; // no data }