thread problem

23 views
Skip to first unread message

Ymonkey

unread,
Oct 31, 2008, 6:28:30 PM10/31/08
to spserver
非常感谢你开发的这个代码。
目前我想用你这个server做一个实时数据接收的server,用于信号分析。需要接收60个remote unit的数据,每个unit每秒钟发送
10个256字节的数据。由于某些原因,我们给每个unit开了一个独立的端口。
我在使用你的codes时, 我就直接new 了 60 个SP_IOCPServer,只是端口不同。当然不是每个unit同时在线,但至少有30个
同时在线。我在离线测试的时候,还是可以用。但是我让程序在线接收数据时,在收到每个socket后建立线程,在所有的线程建立完成前总是弹出
Debug c++ library的错误。似乎这种在线方式无法快速的建立线程。而且即使在离线的状态下,接收的数据也不全(简单的屏幕显示),容易
丢数据。请问哪些地方可以改进一下。谢谢

stephen.nil

unread,
Nov 1, 2008, 8:28:36 AM11/1/08
to spse...@googlegroups.com
Hi, Ymonkey

对于你的描述,有几个地方没明白是什么意思。

1.所谓的离线和在线是什么意思?
2.SP_IocpServer 在调用 run 方法之后,线程应该就已经创建了。
你提到的下列内容,没明白是什么意思
>>但是我让程序在线接收数据时,在收到每个socket后建立线程,在所有的线程建立完成前总是弹出
>>Debug c++ library的错误。似乎这种在线方式无法快速的建立线程。


Best regards,

stephen.nil
2008-11-01

Yuan Zhiyong

unread,
Nov 1, 2008, 11:30:20 PM11/1/08
to spse...@googlegroups.com
你好。谢谢
我说的在线方式就是: 把 server程序接到实际的网络上实时接收数据。
而我为了进行软件测试,做了一个离线的客户端,发送数据库的数据用于测试,其连接速度可能没有在线那么快。
在进行实际在线运行时,我观察到所有线程在完全建立之前,谈出Debug c++ library的错误。
另外,使用这么库,在离线测试时有丢数据的现象。

2008/11/1 stephen.nil <steph...@gmail.com>

stephen.nil

unread,
Nov 2, 2008, 4:59:44 AM11/2/08
to spse...@googlegroups.com
Hi, Yuan Zhiyong

1.数据包收得不完整,要看你用的 decoder 是怎么写的。
用的是现有的 LineDecoder 还是自己写的呢?
2.Debug C++ library 的问题,猜测有几个可能的原因
1)编译的时候,project setting 有没有设置为多线程模式?
2)用的是 Debug 还是 release 的库?如果 release 库有问题,请用 debug 版的试试。


Best regards,

stephen.nil
2008-11-02

Yuan Zhiyong

unread,
Nov 2, 2008, 10:35:17 AM11/2/08
to spse...@googlegroups.com
很感谢你的提示。我使用的是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方式处理数据很慢呢?
 
 
2008/11/2 stephen.nil <steph...@gmail.com>

Yuan Zhiyong

unread,
Nov 2, 2008, 10:44:23 AM11/2/08
to spse...@googlegroups.com
Hi, 我用的是vc.net 2003编译的。

2008/11/2 stephen.nil <steph...@gmail.com>

lau stephen

unread,
Nov 3, 2008, 9:12:09 PM11/3/08
to spse...@googlegroups.com
SP_DefaultMsgDecoder 是一个最简单的 Decoder ,这个 Decoder 只要读入到有数据,就会触发 Handler 的调用。
这个 Decoder 无法保证可以读入任何一个完整的请求包,你需要自己针对你的需求写一个 Decoder ,
在 decode 函数中对读入的数据做判断。

2008/11/2 Yuan Zhiyong <yuan...@gmail.com>:

Yuan Zhiyong

unread,
Nov 4, 2008, 3:11:27 PM11/4/08
to spse...@googlegroups.com
Thank you.
我向其他人询问了。我们的unit发送的数据包是1024个字节,但是包含四个数据内容,其他的为零。格式为:
56个字符,200个零,56个字符,200个零,56个字符,200个零,56个字符,200个零
我只所以选择QueueSize为256,是想读一条就存一条数据,解析方便。
我试验了一下,即使采用SP_DefaultMsgDecoder ,QueueSize设置为1024,其得到的数据还是只有256字节,并没有得到完整的1024个字节。
我重新写一个Decoder吧。
另外,// free(line); 这句话会导致程序崩溃,因此我没有使用这句话。但可能引起内存无法释放。我不知道什么原因

2008/11/3 lau stephen <steph...@gmail.com>

lau stephen

unread,
Nov 4, 2008, 9:35:17 PM11/4/08
to spse...@googlegroups.com
>> > 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;

SP_DefaultMsgDecoder::getMsg 得到的 SP_Buffer 实例,是 decoder 内部用的 pointer 。
SP_Buffer::getBuffer 返回的也是 SP_Buffer 内部使用 pointer 。
这些 pointer 都不应该被释放,否则稍后程序再次引用这些 pointer 的时候,就会读写已经被释放的内存区,从而导致崩溃。

SP_DefaultMsgDecoder 这个只是为了演示而存在的 decoder ,通常不应该应用于实际中。

2008/11/5 Yuan Zhiyong <yuan...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages