目标:是这样的,目前我正在负责一个信息系统的服务器端程序开发,开发工具是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%],其他客户端的请求根本进入不了线程,只有等他们的处理完毕以后才能看到服务器处理其他客户端的请求。
目前线程就跟假线程一样,没有起到同时处理多个客户端请求的需求。 希望大家对上述处理方式提提改良的办法,随便发表发表意见都行。可重分想送!
方法:现在服务器端程序框架主要是:从TThread派生一个处理客户端请求的线程类,在线程类里面主要完成与客户端包文交互,操作数据库,接受发送文件等任务;采用TServerSocket侦听网络连接,一旦接收到连接请求,即开启一个线程,并将socket 的句柄传递进入线程,在线程内部使用socket的基础函数recv,send等来与客户端进行交互。send调用的时候没有做什么限制,是将整个流全部发送send出去,而recv循环调用,每次接受2048bytes,直到接受到自定义的包文结束标志为止,如果中间recv返回值为0,-1,则在循环内部sleep(可配置参数)一段时间后再调用recv,如果连续10次这样sleep()后还是没有接收到数据,则端开与客户端的连接结束线程。
问题:服务器同时对教小包文[1m以下]传输、处理好象看不出来有什么毛病,感觉还是比较流畅(有10台左右机器一起测试,在任务管理器中最多能看到过3个增加的线程)。但是服务器与客户端要接收或则发送的包文比教大的时候超过2m的时候,发现服务器cpu时间被这个客户端独占掉[有时候达100%],其他客户端的请求根本进入不了线程,只有等他们的处理完毕以后才能看到服务器处理其他客户端的请求。
目前线程就跟假线程一样,没有起到同时处理多个客户端请求的需求。 希望大家对上述处理方式提提改良的办法,随便发表发表意见都行。可重分想送!
sleep的方法我已经用过了,不对的!
sleep其实也是独占CPU的!
你具体是怎么做的??
...如果中间recv返回值为0,-1,则在循环内部sleep(可配置参数)...
应该在每个SEND或RECV的循环里面都要SLEEP。
还有,我一开始,其实就是使用TSERVERSOCKET的TSERVERSOCKETTHREAD 类的,情况比现在更药糟糕,后来我在DELPHI下面看了BORLAND公司的TSERVERSOCKET源码,发现有些地方有问题。
也较可能。。呵呵。能不能说清楚点啊!!iocp的话是可以解决的。。为每个客户连接维护一个状态就可以你不是用TServerSocket吗??晕了!!呵呵