很感谢你的提示。我使用的是SP_DefaultMsgDecoder。 就是收到256个数据后直接保存成char,然后我自己解析成数据存在access数据库内。那个字符串解析和数据库存储的程序在其他程序中很好用,不会造成很大时间延迟而丢数据。即使我只是简单的printf数据,也会丢数据。
virtual int start( SP_Request * request, SP_Response * response )
{
request->setMsgDecoder( new SP_DefaultMsgDecoder() );
return 0;
}
// return -1 : terminate session, 0 : continue
virtual int handle( SP_Request * request, SP_Response * response )
{
SP_DefaultMsgDecoder* decoder = (SP_DefaultMsgDecoder*) request->getMsgDecoder();
SP_Buffer* queue = decoder->getMsg();
char * line = (char*) queue->getBuffer();
printf("%s\n", line);
// free(line); 这句话会导致程序崩溃,因此我没有使用这句话。但可能引起内存无法释放。我不知道什么原因
int ret = 0;
return ret;
}
在main函数中,我采用如下方法初始化各server,就是从一个文本文件中读出port,然后new一个新的server,并把server的指针放在一个vector中,便于后面的调用:
int maxThreads = 4, maxConnections = 20000;
int timeout = 120, reqQueueSize = 256;
const char * serverType = "hahs";
。。。。。。
if( 0 == strcasecmp( serverType, "hahs" ) )
{
while (fscanf(pUnitFile, "%s %d %f %f %d %d %c %d\n", name, &port, &longt, &latt, &cx, &cy, &p, &uid) != EOF)
{
// add some things
if(p != 'E' && p != 'W' && p != 'A' && p != 'T')
{
printf("The unit information is not right. return!n");
exit(EXIT_SUCCESS);
}
server = new SP_IocpServer( "", port, new SP_EchoHandlerFactory() );
server->setTimeout( timeout );
server->setMaxThreads( maxThreads );
server->setReqQueueSize( reqQueueSize, "Byebye\r\n" );
server->setMaxConnections( maxConnections );
server->run();
g_pSocket.push_back(server); //server的vecor
}
}
我已经设置成多线程,用的是debug方式。是不是hahs方式处理数据很慢呢?