#include #include #include #include #include #include #include #include #include #define MAXIMUM_NUMBER_OF_CLIENTS 64 #define MAXIMUM_NUMBER_OF_WORKERS 32 #define FILE_SIZE ((1024*1024*8)-CLIENT_OUTBOUND_BUFFER_MAX) #define SIXTY_FOUR_K (64*1024) #define SIXTEEN_K (16*1024) DWORD InitialBuffer[SIXTY_FOUR_K/sizeof(DWORD)]; #define NUMBER_OF_WRITES ((FILE_SIZE+CLIENT_OUTBOUND_BUFFER_MAX)/SIXTY_FOUR_K) #define CLIENT_CONNECTED 0x00000001 #define CLIENT_DONE 0x00000002 typedef struct _PER_CLIENT_DATA { SOCKET Socket; OVERLAPPED Overlapped; CLIENT_IO_BUFFER IoBuffer; CHAR OutboundBuffer[CLIENT_OUTBOUND_BUFFER_MAX]; DWORD Flags; HANDLE hEvent; } PER_CLIENT_DATA, *PPER_CLIENT_DATA; typedef struct _PER_THREAD_DATA { DWORD TotalTransactions; DWORD TotalBytesTransferred; } PER_THREAD_DATA, *PPER_THREAD_DATA; PER_THREAD_DATA ThreadData[MAXIMUM_NUMBER_OF_WORKERS]; PER_CLIENT_DATA ClientData[MAXIMUM_NUMBER_OF_CLIENTS]; BOOL fVerbose; BOOL fTcp; DWORD dwNumberOfClients; DWORD dwNumberOfWorkers; DWORD dwConcurrency; DWORD dwWorkIndex; SYSTEM_INFO SystemInfo; HANDLE CompletionPort; DWORD dwActiveClientCount; HANDLE hBenchmarkComplete; HANDLE hBenchmarkStart; DWORD StartTime; DWORD EndTime; HANDLE hFile; DWORD WINAPI Random ( DWORD nMaxValue ); VOID WINAPI ShowUsage( VOID ); VOID WINAPI ParseSwitch( CHAR chSwitch, int *pArgc, char **pArgv[] ); BOOL WINAPI CreateNetConnections( VOID ); BOOL WINAPI CreateWorkers( VOID ); DWORD WINAPI WorkerThread( LPVOID WorkContext ); VOID WINAPI CompleteBenchmark( VOID ); VOID WINAPI SortTheBuffer( LPDWORD Destination, LPDWORD Source, int DwordCount );