testunp.cpp
2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Copyright 2007 Stephen Liu
* For license terms, see the file COPYING along with this library.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <signal.h>
#include <unistd.h>
#include "spmsgdecoder.hpp"
#include "spbuffer.hpp"
#include "spserver.hpp"
#include "splfserver.hpp"
#include "sphandler.hpp"
#include "spresponse.hpp"
#include "sprequest.hpp"
#define MAXN 16384 /* max # bytes client can request */
#define MAXLINE 4096 /* max text line length */
class SP_UnpHandler : public SP_Handler {
public:
SP_UnpHandler(){}
virtual ~SP_UnpHandler(){}
// return -1 : terminate session, 0 : continue
virtual int start( SP_Request * request, SP_Response * response ) {
request->setMsgDecoder( new SP_LineMsgDecoder() );
return 0;
}
// return -1 : terminate session, 0 : continue
virtual int handle( SP_Request * request, SP_Response * response ) {
SP_LineMsgDecoder * decoder = (SP_LineMsgDecoder*)request->getMsgDecoder();
int ntowrite = atol( (char*)decoder->getMsg() );
if ((ntowrite <= 0) || (ntowrite > MAXN)) {
syslog( LOG_WARNING, "WARN: client request for %d bytes", ntowrite );
return -1;
}
char result[ MAXN ];
response->getReply()->getMsg()->append( result, ntowrite );
return -1;
}
virtual void error( SP_Response * response ) {}
virtual void timeout( SP_Response * response ) {}
virtual void close() {}
};
class SP_UnpHandlerFactory : public SP_HandlerFactory {
public:
SP_UnpHandlerFactory() {}
virtual ~SP_UnpHandlerFactory() {}
virtual SP_Handler * create() const {
return new SP_UnpHandler();
}
};
//---------------------------------------------------------
int main( int argc, char * argv[] )
{
int port = 1770, maxThreads = 10;
const char * serverType = "lf";
extern char *optarg ;
int c ;
while( ( c = getopt ( argc, argv, "p:t:s:v" )) != EOF ) {
switch ( c ) {
case 'p' :
port = atoi( optarg );
break;
case 't':
maxThreads = atoi( optarg );
break;
case 's':
serverType = optarg;
break;
case '?' :
case 'v' :
printf( "Usage: %s [-p <port>] [-t <threads>] [-s <hahs|lf>]\n", argv[0] );
exit( 0 );
}
}
openlog( "testunp", LOG_CONS | LOG_PID | LOG_PERROR, LOG_USER );
setlogmask( LOG_UPTO( LOG_WARNING ) );
if( 0 == strcasecmp( serverType, "hahs" ) ) {
SP_Server server( "", port, new SP_UnpHandlerFactory() );
server.setTimeout( 60 );
server.setMaxThreads( maxThreads );
server.setReqQueueSize( 100, "Sorry, server is busy now!\r\n" );
server.runForever();
} else {
SP_LFServer server( "", port, new SP_UnpHandlerFactory() );
server.setTimeout( 60 );
server.setMaxThreads( maxThreads );
server.setReqQueueSize( 100, "Sorry, server is busy now!\r\n" );
server.runForever();
}
closelog();
return 0;
}