version 1.32, 2005/02/25 07:07:32
|
version 1.33, 2005/03/01 04:26:32
|
|
|
On a 650 Mhz Linux system with tcpdump running, it takes 8 seconds. */ | On a 650 Mhz Linux system with tcpdump running, it takes 8 seconds. */ |
#define TEST_TIMEOUT 20 | #define TEST_TIMEOUT 20 |
| |
/* we often pass this size by reference */ |
|
int sizeofSOCKADDR_IN = sizeof(SOCKADDR_IN); |
|
|
|
/* global test data; server sends it to client, then client verifies it */ | /* global test data; server sends it to client, then client verifies it */ |
char *gTestData; | char *gTestData; |
| |
|
|
| |
static int BlockingServer_Init(int type, SOCKET *sock, SOCKADDR_IN *addr) | static int BlockingServer_Init(int type, SOCKET *sock, SOCKADDR_IN *addr) |
{ | { |
/* BlockingServer_Init creates socket sock of type type and returns assigned port number in addr. |
/* BlockingServer_Init creates socket sock of type type and |
returns server port number */ |
returns assigned port number in addr. */ |
| |
SOCKADDR_IN tmpAddr; | SOCKADDR_IN tmpAddr; |
int bindOK; | int bindOK; |
int listenReturn; | int listenReturn; |
|
int sizeofSOCKADDR_IN = sizeof(SOCKADDR_IN); |
| |
/* create socket */ | /* create socket */ |
*sock = socket(AF_INET, type, 0); | *sock = socket(AF_INET, type, 0); |
|
|
addr->sin_port = htons(0); | addr->sin_port = htons(0); |
| |
/* bind socket to port */ | /* bind socket to port */ |
bindOK = !bind(*sock, (const SOCKADDR *) addr, sizeofSOCKADDR_IN); |
bindOK = !bind(*sock, (const SOCKADDR *) addr, sizeof(SOCKADDR_IN)); |
ok( bindOK , "Error binding client to socket\n"); | ok( bindOK , "Error binding client to socket\n"); |
if( !bindOK ) { | if( !bindOK ) { |
WSACleanup(); | WSACleanup(); |
|
|
int connIndex = 0; | int connIndex = 0; |
SOCKET tmpSock; | SOCKET tmpSock; |
SOCKADDR_IN tmpSockAddr; | SOCKADDR_IN tmpSockAddr; |
|
int sizeofSOCKADDR_IN = sizeof(SOCKADDR_IN); |
| |
/* we require one connection from each client thread */ | /* we require one connection from each client thread */ |
for (connIndex = 0; connIndex < NUM_CLIENTS; connIndex++) { | for (connIndex = 0; connIndex < NUM_CLIENTS; connIndex++) { |
|
|
connection->clientAddr = clientAddr; | connection->clientAddr = clientAddr; |
| |
/* spawn thread to handle sending data */ | /* spawn thread to handle sending data */ |
connection->serverThread.Handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &BlockingServerConnection_Run, connection, 0, &connection->serverThread.ID); |
connection->serverThread.Handle = CreateThread(NULL, 0, |
|
(LPTHREAD_START_ROUTINE) &BlockingServerConnection_Run, connection, 0, |
|
&connection->serverThread.ID); |
| |
return connection; | return connection; |
} | } |
|
|
int bClosed; | int bClosed; |
int totCharsSent = 0; | int totCharsSent = 0; |
int numCharsSent; | int numCharsSent; |
|
int charsToSend; |
const int charsPerSend = 2000; | const int charsPerSend = 2000; |
| |
/* loop and send data */ | /* loop and send data */ |
while( totCharsSent < TEST_DATA_SIZE ) { | while( totCharsSent < TEST_DATA_SIZE ) { |
numCharsSent = send(connection->connectedSocket, gTestData+totCharsSent, (totCharsSent + charsPerSend <= TEST_DATA_SIZE) ? charsPerSend : TEST_DATA_SIZE - totCharsSent, 0); |
if (totCharsSent + charsPerSend <= TEST_DATA_SIZE) { |
|
charsToSend = charsPerSend; |
|
} else { |
|
charsToSend = TEST_DATA_SIZE - totCharsSent; |
|
} |
|
|
|
numCharsSent = send(connection->connectedSocket, &gTestData[totCharsSent], charsToSend, 0); |
ok( numCharsSent != SOCKET_ERROR, "socket error\n" ); | ok( numCharsSent != SOCKET_ERROR, "socket error\n" ); |
| |
/* pass if send buffer is full */ | /* pass if send buffer is full */ |
|
|
| |
/* start server thread */ | /* start server thread */ |
trace("starting server thread\n"); | trace("starting server thread\n"); |
serverThread.Handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &BlockingServer, &sock, 0, &serverThread.ID); |
serverThread.Handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &BlockingServer, |
|
&sock, 0, &serverThread.ID); |
| |
/* start client threads */ | /* start client threads */ |
clientThreads = malloc(sizeof(struct ThreadInfo) * NUM_CLIENTS); | clientThreads = malloc(sizeof(struct ThreadInfo) * NUM_CLIENTS); |
memset(clientThreads, 0, sizeof(struct ThreadInfo) * NUM_CLIENTS); | memset(clientThreads, 0, sizeof(struct ThreadInfo) * NUM_CLIENTS); |
| |
for(threadIndex = 0; threadIndex < NUM_CLIENTS; threadIndex++) { | for(threadIndex = 0; threadIndex < NUM_CLIENTS; threadIndex++) { |
clientThreads[threadIndex].Handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &BlockingClient, (void *) &serverPort, 0, &clientThreads[threadIndex].ID); |
clientThreads[threadIndex].Handle = CreateThread(NULL, 0, |
|
(LPTHREAD_START_ROUTINE) &BlockingClient, (void *) &serverPort, 0, |
|
&clientThreads[threadIndex].ID); |
} | } |
trace("%d clients started\n", NUM_CLIENTS); | trace("%d clients started\n", NUM_CLIENTS); |
| |
|
|
int wsastartup_result; | int wsastartup_result; |
int versionOK; | int versionOK; |
int i; | int i; |
|
char testPattern[11] = { 'A', 'O', 'E', 'U', 'I', 'D', 0x00, 0x05, 0x10, 0x15, 0x20 }; |
srand(1); |
|
| |
/* fill out test data */ | /* fill out test data */ |
gTestData = malloc(TEST_DATA_SIZE); | gTestData = malloc(TEST_DATA_SIZE); |
for(i = 0; i < (TEST_DATA_SIZE/sizeof(int)); i++) { |
for(i = 0; i < TEST_DATA_SIZE; i++) { |
*(((int *) gTestData) + i) = rand(); |
gTestData[i] = testPattern[i%11]; |
} | } |
| |
/* check for compatible winsock version */ | /* check for compatible winsock version */ |
|
|
| |
START_TEST(wsock32_main) | START_TEST(wsock32_main) |
{ | { |
const int numTests = 3; |
static const int numTests = 3; |
| |
trace("test 1 of %d:\n", numTests); | trace("test 1 of %d:\n", numTests); |
test_Startup(); | test_Startup(); |