cdev-1.7.2n
This commit is contained in:
129
extensions/cdevGenericServer/cdevReactor/ServerTest/ClientTest1.cc
Executable file
129
extensions/cdevGenericServer/cdevReactor/ServerTest/ClientTest1.cc
Executable file
@@ -0,0 +1,129 @@
|
||||
#include <cdevReactor.h>
|
||||
#include <cdevSocketAcceptor.h>
|
||||
#include <cdevBufferedSocket.cc>
|
||||
#include "TestNode.h"
|
||||
|
||||
TestNode * TestNode::freeList = NULL;
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
cdevReactor GlobalReactor;
|
||||
|
||||
class ServerHandler : public cdevEventHandler, public cdevNodeFactory
|
||||
{
|
||||
private:
|
||||
cdevBufferedSocket stream;
|
||||
int count;
|
||||
int inboundCount;
|
||||
|
||||
public:
|
||||
ServerHandler ( const cdevAddr &addr )
|
||||
: count(0), inboundCount(0), stream(0, 1, this)
|
||||
{
|
||||
open(addr);
|
||||
}
|
||||
|
||||
int open ( const cdevAddr & addr )
|
||||
{
|
||||
int retval = -1;
|
||||
|
||||
if((retval = stream.connect(addr))==0)
|
||||
{
|
||||
retval = GlobalReactor.registerHandler(this, WRITE_MASK);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
int getHandle ( void ) const
|
||||
{
|
||||
return stream.getHandle();
|
||||
}
|
||||
|
||||
void setHandle ( int handle )
|
||||
{
|
||||
stream.setHandle(handle);
|
||||
}
|
||||
|
||||
cdevStreamNode * newNode ( ssize_t size )
|
||||
{
|
||||
TestNode * node = new TestNode;
|
||||
node->setLen(size);
|
||||
return node;
|
||||
}
|
||||
|
||||
int handleInput ( void )
|
||||
{
|
||||
int retval = 0;
|
||||
cdevStreamNode * node = NULL;
|
||||
|
||||
if((retval = stream.receive())>0)
|
||||
{
|
||||
while((node=stream.dequeueInbound())!=NULL)
|
||||
{
|
||||
if(((inboundCount++)%1000)==0) fprintf(stdout, "CLIENT: I received \"%s\"\n", node->getBuf());
|
||||
delete node;
|
||||
}
|
||||
}
|
||||
|
||||
if(retval<0) setMask(DONT_CALL);
|
||||
else if(!stream.inboundReady()) setMask(WRITE_MASK);
|
||||
|
||||
return retval>=0?0:-1;
|
||||
}
|
||||
|
||||
int handleOutput ( void )
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
if(!stream.outboundReady())
|
||||
{
|
||||
for(int i=0; i<1000; i++)
|
||||
{
|
||||
TestNode * node = new TestNode;
|
||||
node->setLen(sprintf(node->getBuf(), "Client Packet %i", count++)+1);
|
||||
stream.enqueueOutbound(node);
|
||||
}
|
||||
setMask(WRITE_MASK);
|
||||
}
|
||||
|
||||
retval=stream.transmit();
|
||||
if(retval<0) setMask(DONT_CALL);
|
||||
else if(!stream.outboundReady()) setMask(READ_MASK);
|
||||
|
||||
return retval>=0?0:-1;
|
||||
}
|
||||
|
||||
int handleClose ( void )
|
||||
{
|
||||
stream.close();
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
int main ( int argc, char * argv[], char * envp [] )
|
||||
{
|
||||
if(argc<3)
|
||||
{
|
||||
fprintf(stderr, "%s [host] [port]\n", "ClientTest1");
|
||||
return -1;
|
||||
}
|
||||
|
||||
char * host = argv[1];
|
||||
short port = atoi(argv[2]);
|
||||
|
||||
|
||||
|
||||
cdevInetAddr serverAddr( port, host);
|
||||
printf("Connecting to %s:%i\n", serverAddr.getHostName(),serverAddr.getPortNum());
|
||||
ServerHandler * client = new ServerHandler(serverAddr);
|
||||
|
||||
for(int i=0; i<100; i++)
|
||||
{
|
||||
if(i%10==0) fprintf(stdout, "====> Have reached iteration %i\n", i);
|
||||
GlobalReactor.handleEvents(1.0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
17
extensions/cdevGenericServer/cdevReactor/ServerTest/Makefile
Executable file
17
extensions/cdevGenericServer/cdevReactor/ServerTest/Makefile
Executable file
@@ -0,0 +1,17 @@
|
||||
SHOBJ=NO
|
||||
ARCH =OS
|
||||
|
||||
include ../../include/makeinclude/Makefile.$(ARCH)
|
||||
|
||||
APPNAME = "cdevReactor Client/Server Test"
|
||||
CXXEXTRA = -I../
|
||||
TARGETS = ServerTest1 ClientTest1
|
||||
|
||||
targets : $(TARGETS)
|
||||
|
||||
ServerTest1 : $(OBJDIR)/ServerTest1.o
|
||||
$(LINK.cc) -o $@ $^ -L$(CDEVLIB) -lcdevReactor -lm
|
||||
|
||||
ClientTest1 : $(OBJDIR)/ClientTest1.o
|
||||
$(LINK.cc) -o $@ $^ -L$(CDEVLIB) -lcdevReactor -lm
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
.SUFFIXES: .cc .obj
|
||||
|
||||
ARCH = WINNT-4.0
|
||||
|
||||
include ..\..\include\makeinclude\Makefile.WINNT-4.0
|
||||
|
||||
BASEBIN = .
|
||||
OBJDIR = .exec\WINNT-4.0
|
||||
CXXINCLUDES = /I ..\
|
||||
|
||||
TARGETS = $(BASEBIN)\ServerTest1.exe $(BASEBIN)\ClientTest1.exe
|
||||
|
||||
targets : $(TARGETS)
|
||||
|
||||
|
||||
$(BASEBIN)\ServerTest1.exe : .exec\$(TARGETDIR)\ServerTest1.obj
|
||||
$(LINK) \
|
||||
$(CDEVLIB)\cdevReactor.lib $(LINK_EXE_FLAGS) /out:$@ \
|
||||
.exec\$(TARGETDIR)\ServerTest1.obj
|
||||
|
||||
$(BASEBIN)\ClientTest1.exe : .exec\$(TARGETDIR)\ClientTest1.obj
|
||||
$(LINK) \
|
||||
$(CDEVLIB)\cdevReactor.lib $(LINK_EXE_FLAGS) /out:$@ \
|
||||
.exec\$(TARGETDIR)\ClientTest1.obj
|
||||
|
||||
purgeworkspace :
|
||||
-@del *.dsp
|
||||
-@del *.plg
|
||||
-@del *.dsw
|
||||
-@del *.ncb
|
||||
-@del *.opt
|
||||
|
||||
176
extensions/cdevGenericServer/cdevReactor/ServerTest/ServerTest1.cc
Executable file
176
extensions/cdevGenericServer/cdevReactor/ServerTest/ServerTest1.cc
Executable file
@@ -0,0 +1,176 @@
|
||||
#include <cdevReactor.h>
|
||||
#include <cdevSocketAcceptor.h>
|
||||
#include <cdevBufferedSocket.cc>
|
||||
#include "TestNode.h"
|
||||
|
||||
TestNode * TestNode::freeList = NULL;
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
cdevReactor GlobalReactor;
|
||||
|
||||
class ClientHandler : public cdevEventHandler, public cdevNodeFactory
|
||||
{
|
||||
friend class Acceptor;
|
||||
|
||||
private:
|
||||
cdevBufferedSocket stream;
|
||||
int inboundCount;
|
||||
int count;
|
||||
|
||||
public:
|
||||
ClientHandler ( void ) : count(0), inboundCount(0), stream(0, 1, this) {}
|
||||
|
||||
int open ( void )
|
||||
{
|
||||
return GlobalReactor.registerHandler(this, READ_MASK);
|
||||
}
|
||||
|
||||
int getHandle ( void ) const
|
||||
{
|
||||
return stream.getHandle();
|
||||
}
|
||||
|
||||
void setHandle ( int handle )
|
||||
{
|
||||
stream.setHandle(handle);
|
||||
}
|
||||
|
||||
cdevStreamNode * newNode ( ssize_t size )
|
||||
{
|
||||
TestNode * node = new TestNode;
|
||||
node->setLen(size);
|
||||
return node;
|
||||
}
|
||||
|
||||
int handleInput ( void )
|
||||
{
|
||||
int retval = 0;
|
||||
cdevStreamNode * node = NULL;
|
||||
|
||||
if((retval = stream.receive())>0)
|
||||
{
|
||||
while((node=stream.dequeueInbound())!=NULL)
|
||||
{
|
||||
if(((inboundCount++)%1000)==0) fprintf(stdout, "SERVER: I received \"%s\"\n", node->getBuf());
|
||||
delete node;
|
||||
}
|
||||
}
|
||||
|
||||
if(!stream.inboundReady())
|
||||
{
|
||||
for(int i=0; i<1000; i++)
|
||||
{
|
||||
TestNode * node = new TestNode;
|
||||
node->setLen(sprintf(node->getBuf(), "Server Packet %i", count++)+1);
|
||||
stream.enqueueOutbound(node);
|
||||
}
|
||||
setMask(READ_MASK|WRITE_MASK);
|
||||
}
|
||||
|
||||
if(retval<0) setMask(DONT_CALL);
|
||||
|
||||
return retval>=0?0:-1;
|
||||
}
|
||||
|
||||
int handleOutput ( void )
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
retval=stream.transmit();
|
||||
if(retval<0) setMask(DONT_CALL);
|
||||
else if(!stream.outboundReady()) setMask(READ_MASK);
|
||||
|
||||
return retval>=0?0:-1;
|
||||
}
|
||||
|
||||
int handleClose ( void )
|
||||
{
|
||||
fprintf(stdout, "Closing connection to host\n");
|
||||
stream.close();
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class Acceptor : public cdevEventHandler
|
||||
{
|
||||
public:
|
||||
Acceptor ( const cdevAddr &addr )
|
||||
{
|
||||
open(addr);
|
||||
GlobalReactor.registerHandler(this, READ_MASK);
|
||||
}
|
||||
|
||||
int open ( const cdevAddr &addr )
|
||||
{
|
||||
int result = -1;
|
||||
if (acceptor.open (addr, TRUE) == -1)
|
||||
{
|
||||
fprintf(stdout, "Acceptor [ERROR]: Failed to open listening port");
|
||||
}
|
||||
else if (acceptor.setFlags (O_NONBLOCK) == -1)
|
||||
{
|
||||
fprintf(stdout, "Acceptor [ERROR]: Could not enable non-blocking I/O");
|
||||
}
|
||||
else result = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
int getHandle ( void ) const
|
||||
{
|
||||
return acceptor.getHandle();
|
||||
}
|
||||
|
||||
void setHandle ( int handle )
|
||||
{
|
||||
acceptor.setHandle(handle);
|
||||
}
|
||||
|
||||
int handleInput ( void )
|
||||
{
|
||||
cdevInetAddr addr;
|
||||
ClientHandler * handler = new ClientHandler;
|
||||
if(acceptor.accept(handler->stream, &addr)!=-1)
|
||||
{
|
||||
fprintf(stdout, "Received connection from host %s\n", addr.getHostName());
|
||||
handler->open();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int handleClose ( void )
|
||||
{
|
||||
acceptor.close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
cdevSocketAcceptor acceptor;
|
||||
};
|
||||
|
||||
|
||||
|
||||
int main (int argc, char * argv[], char * envp[])
|
||||
{
|
||||
if(argc<2)
|
||||
{
|
||||
fprintf(stderr, "%s [port]\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
short port = atoi(argv[1]);
|
||||
cdevInetAddr acceptAddr(port, (long)INADDR_ANY);
|
||||
Acceptor * acceptor = new Acceptor(acceptAddr);
|
||||
|
||||
for(int i=0; i<100; i++)
|
||||
{
|
||||
if(i%10==0) fprintf(stdout, "====> Have reached iteration %i\n", i);
|
||||
GlobalReactor.handleEvents(1.0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
48
extensions/cdevGenericServer/cdevReactor/ServerTest/TestNode.h
Executable file
48
extensions/cdevGenericServer/cdevReactor/ServerTest/TestNode.h
Executable file
@@ -0,0 +1,48 @@
|
||||
#include <cdevStreamQueue.h>
|
||||
|
||||
class TestNode : public cdevStreamNode
|
||||
{
|
||||
private:
|
||||
static TestNode * freeList;
|
||||
TestNode * freeListNext;
|
||||
|
||||
char buf[75];
|
||||
size_t len;
|
||||
|
||||
public:
|
||||
TestNode ( void )
|
||||
: len(0), freeListNext(NULL)
|
||||
{
|
||||
}
|
||||
size_t getLen ( void ) const { return len; }
|
||||
void setLen ( size_t size ) { len = size; }
|
||||
char * getBuf ( void ) const { return (char *)buf; }
|
||||
void setBuf ( char * buffer, size_t size)
|
||||
{
|
||||
strcpy(buf, buffer);
|
||||
len = size;
|
||||
}
|
||||
|
||||
void * operator new ( size_t )
|
||||
{
|
||||
TestNode * node;
|
||||
if(freeList==NULL)
|
||||
{
|
||||
freeList = ::new TestNode[1000];
|
||||
for(int i=0; i<999; i++)
|
||||
{
|
||||
freeList[i].freeListNext = &freeList[i+1];
|
||||
}
|
||||
}
|
||||
node = freeList;
|
||||
freeList = node->freeListNext;
|
||||
return node;
|
||||
}
|
||||
|
||||
void operator delete ( void * ptr )
|
||||
{
|
||||
TestNode * node = (TestNode *)ptr;
|
||||
node->freeListNext = freeList;
|
||||
freeList = node;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user