线程内部的socket处理方法,希望大家有什么想法都可以回帖,都有分的!
目标:是这样的,目前我正在负责一个信息系统的服务器端程序开发,开发工具是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%],其他客户端的请求根本进入不了线程,只有等他们的处理完毕以后才能看到服务器处理其他客户端的请求。
目前线程就跟假线程一样,没有起到同时处理多个客户端请求的需求。 希望大家对上述处理方式提提改良的办法,随便发表发表意见都行。可重分想送!