目标:是这样的,目前我正在负责一个信息系统的服务器端程序开发,开发工具是BORLAND的C++ BUILDER6.0,系统平台是win2000 。服务器要完成与多个客户端的包文交互,同时可能有大文件传输存在[目前限制5m],服务器通过BDE与数据库交互。
    方法:现在服务器端程序框架主要是:从TThread派生一个处理客户端请求的线程类,在线程类里面主要完成与客户端包文交互,操作数据库,接受发送文件等任务;采用TServerSocket侦听网络连接,一旦接收到连接请求,即开启一个线程,并将socket 的句柄传递进入线程,在线程内部使用socket的基础函数recv,send等来与客户端进行交互。send调用的时候没有做什么限制,是将整个流全部发送send出去,而recv循环调用,每次接受2048bytes,直到接受到自定义的包文结束标志为止,如果中间recv返回值为0,-1,则在循环内部sleep(可配置参数)一段时间后再调用recv,如果连续10次这样sleep()后还是没有接收到数据,则端开与客户端的连接结束线程。
    问题:服务器同时对教小包文[1m以下]传输、处理好象看不出来有什么毛病,感觉还是比较流畅(有10台左右机器一起测试,在任务管理器中最多能看到过3个增加的线程)。但是服务器与客户端要接收或则发送的包文比教大的时候超过2m的时候,发现服务器cpu时间被这个客户端独占掉[有时候达100%],其他客户端的请求根本进入不了线程,只有等他们的处理完毕以后才能看到服务器处理其他客户端的请求。
    目前线程就跟假线程一样,没有起到同时处理多个客户端请求的需求。 希望大家对上述处理方式提提改良的办法,随便发表发表意见都行。可重分想送!

解决方案 »

  1.   

    其实独占CPU,主要是在循环接受大文件和发送大文件的时候。这里能否在循环内部,释放CPU,以分配CPU响应其他客户端?要怎样实现呢??希望大家赐教!
      

  2.   

    在线程循环里面稍稍SLEEP一下就行了。。
      

  3.   

    to[halfdream]:
    sleep的方法我已经用过了,不对的!
    sleep其实也是独占CPU的!
      

  4.   

    "一旦接收到连接请求,即开启一个线程,并将socket 的句柄传递进入线程",来一个客户,产生一个线程?10台机子同时请求,只产生了3个线程,不明白!
      

  5.   

    accept后再开启线程是不是合理些。我现在很少用控件。
      

  6.   

    TServerSocket这个控件其实好用,不过我不熟。工作原因,一年没用Delphi了。
      

  7.   

    呵呵呵....搞错了没有.SLEEP还什么独占CPU??
    你具体是怎么做的??
      

  8.   

    哦你的做法这样才SLEEP一下啊?
    ...如果中间recv返回值为0,-1,则在循环内部sleep(可配置参数)...
    应该在每个SEND或RECV的循环里面都要SLEEP。
      

  9.   

    另外,你既然用了TServerSocket,为什么不按照它的方式使用它的一整套东西呢?
      

  10.   

    to[halfdream(哈欠)]:后来我也再在每个SEND或RECV的循环里面都调用SLEEP过,可以明显看到CPU的使用情况降了下来,但是我的其他线程还是没有办法启动,SLEEP的时间一过,任然只有当前的一个线程响应网络一个客户端,其他客户端无法跟服务器建立连接的!
        还有,我一开始,其实就是使用TSERVERSOCKET的TSERVERSOCKETTHREAD 类的,情况比现在更药糟糕,后来我在DELPHI下面看了BORLAND公司的TSERVERSOCKET源码,发现有些地方有问题。
      

  11.   

    TServerSocket,好像不是很稳定,还是用Indy的控件好
      

  12.   

    !!!!!!!!!!!!!!为什么要sleep!!!真是奇怪!!呵呵。是非阻塞的吗??10台机子同时请求,只产生了3个线程??我也不明白。只有完成端口,重叠iO,Event select等才会有这种情况,你那个“其他客户端的请求根本进入不了线程”
    也较可能。。呵呵。能不能说清楚点啊!!iocp的话是可以解决的。。为每个客户连接维护一个状态就可以你不是用TServerSocket吗??晕了!!呵呵