Simple Example Code
The following is a very simple example of how to get a basic I/O completion ports TCP server up and running using the BWY Systems Server library.
#include <stdlib.h>
#include <stdio.h>
#include <BWYSystemsServer.h> // All that's needed for the library.
#ifdef WIN32
#pragma comment(lib, "BWYSystemsServer.lib") // Link to the library to get
// the exported functions.
#endif
// Declare the server call back functions:
VOID WINAPI ServerInitThreadProc(HANDLE hServer, LPVOID &lpThreadData);
VOID WINAPI ServerExitThreadProc(HANDLE hServer, LPVOID lpThreadData);
BOOL WINAPI ServerRecvProc(HANDLE hServer, LPVOID &lpThreadData, HANDLE hClient,
BYTE *lpRecv, ULONG nRecvSize, BOOL &bFreeBuffer);
BOOL WINAPI ServerConnectProc(HANDLE hServer, LPVOID &lpThreadData, HANDLE hClient);
VOID WINAPI ServerDisconnectProc(HANDLE hServer, LPVOID &lpThreadData, HANDLE hClient);
int main(int argc, char **argv)
{
HANDLE hServer = NULL;
BWYSERVERSETUP Setup;
// Initialize the Setup structure:
Setup.nListenPort = 5050;
Setup.nSockets = BWYSERVER_DEFAULT; // Use the default number of accept sockets
// to be created and ready for new connections.
Setup.nThreads = BWYSERVER_DEFAULT; // Use the default number of worker threads
// (initially based on the number of processors).
Setup.lpListenAddress = NULL;
Setup.ServerConnectProc = ServerConnectProc;
Setup.ServerDisconnectProc = ServerDisconnectProc;
Setup.ServerExitThreadProc = ServerExitThreadProc;
Setup.ServerInitThreadProc = ServerInitThreadProc;
Setup.ServerRecvProc = ServerRecvProc;
Setup.lpGlobalData = (LPVOID)NULL;
// Create the Server:
hServer = BWYServerCreate(&Setup);
// At this point all worker threads are created and the listening socket is
// binded to port 5050 (specified above).
...
// Do something here like user input, ect...
...
// Close down the Server:
if(hServer != NULL)
{
BWYServerClose(hServer);
hServer = NULL;
}
return 0;
}
VOID WINAPI ServerInitThreadProc(HANDLE hServer, LPVOID &lpThreadData)
{
// This function will be called for every worker thread
// that is created.
// You could do something here to initialize anything
// associated with this new worker thread.
}
VOID WINAPI ServerExitThreadProc(HANDLE hServer, LPVOID lpThreadData)
{
// This function is called for every thread upon shutdown.
}
BOOL WINAPI ServerConnectProc(HANDLE hServer, LPVOID &lpThreadData, HANDLE hClient)
{
// This function is called for every newly connected socket.
return TRUE; // Return TRUE to allow the connection or FALSE to reject it.
}
VOID WINAPI ServerDisconnectProc(HANDLE hServer, LPVOID &lpThreadData, HANDLE hClient)
{
// This function is called every time a socket is disconnected.
}
BOOL WINAPI ServerRecvProc(HANDLE hServer, LPVOID &lpThreadData, HANDLE hClient,
BYTE *lpRecv, ULONG nRecvSize, BOOL &bFreeBuffer)
{
// This function is called every time data is received on a socket.
bFreeBuffer = TRUE; // Notify the Server that it is not needed
// to buffer the received data.
printf("Data received!\r\n");
return TRUE; // Return TRUE to continue the connection with the
// client or FALSE to disconnect the client.
}