kmzym:
    你好,邮件已收到,非常感谢,不过我测试好像它不能正确显示客户端发送过来的内容,我会再看看,向你学习。所有对完成端口和重叠I/O有研究的朋友:
    你们好,哪位还有别的实现啊?兄弟上火啊

解决方案 »

  1.   

    你真的必须用完成端口吗?我一两天前给了你一个vc的socketserver的类,它真的能用,尽管完成端口非常不错,但是掌握起来非常不容易,我这里也有一个完成端口的程序ExSocketServer,但是我曾经帮助我的同事移植到delphi过,很可惜不行,因为delphi没有对WSARecv等异步通讯的API进行二次封装,再有就是用delphi作为socketserver有些勉为其难了
      

  2.   

    另外,完成端口必须在win2000下才可以。
    有什么问题吗?
      

  3.   

    to stephenland74(程序员):
      老板要求这样,当然没有别的路可以选择to kmzym()(也包括其他完成端口高手):
      显示是否正确先不管他,我现在有重要问题,想和大家讨论,描述如下:
      1、客户端连接上来后,发送请求报文,格式为长度信息+业务信息+标志位+数据,想在服务器端(完成端口)处理它,如果第一次投递wsarecv就收够了所有数据,当然万事大吉,现假设未收全,需要再投递wsarecv,那么前面收到的数据如何保存,改写你的那个结构体?我暂时还未试
      2、数据收完了,需要处理,假设处理很费时,那么显然不能让工作线程来干这种粗活,这时需要创建另外的处理线程来处理,我理解是把那个结构和收到的内容传给处理线程,它处理完了,直接投递wsasend返回处理结果
      3、假如客户端上传大文件,那服务端应该如何操作,它一次收肯定收不完,肯定多次收,每收到一次似乎都应该有处理线程来保存数据,这样的话,后续的包如何保证不冲突的写到同一个文件
      4、那个transmitfile你用过吗,是否一次调用一直到传输完毕才触发完成事件,有没有例子看看
      

  4.   

    to stephenland74(程序员):
       因为delphi没有对WSARecv等异步通讯的API进行二次封装,再有就是用delphi作为socketserver有些勉为其难了??????
       delphi真的搞不定这个问题?
      

  5.   

    搂主提出了很多问题,一时很难说清楚,只能给你一些提示。
    1,异步接收的问题。数据一次收不全,你可以像平时处理异步接收一样,为没每个用户开辟一个缓存(或一个处理类实例),等数据传送完了再处理。大文件也一样处理。
    2,多线程问题。用完成端口肯定用到多线程,一个监听线程,根据处理器个数创建IO端口读取线程,不让IO线程来干粗活的话,还要创建若干工作线程(线程池)。我的测试程序中只有监听线程和一个IO读取线程。
    3,同步访问冲突的问题。如果有多个线程访问共享资源、全局变量,要进行同步处理。参考互斥、信号量等同步方法。
    4,transmitfile没有用过。不过我估计如果用于传送的Socket和完成端口关联后,每次收发数据都会触发完成事件。使用完成端口,用transmitfile不是很方便,发送文件完全可以自己处理,还简单些。
      

  6.   

    对第一个问题,如果为每个用户开一个缓存(或一个处理类实例)在超大连接数时(比如上千)这样是否会导致线程数过多,CPU切换不灵。
    老板提出要应付很多下载文件的请求,打个比方,成百上千客户同时下载一个文件,如何处理更有效?
      

  7.   

    WSARecv和WSASend是将socket的overlapped与完成端口进行关联的唯一途径,至于delphi我可以肯定在delphi6中没有该函数的封装,你也可以自己试一试,如果你的程序需要应对高并发,那么使用完成端口应该是最佳选择,这个时候使用vc实现性能会更好一些,我有一份vc实现完成端口的类Exsocketserver,和上次的差不多,但是上次是基于事件选择的,这个是基于完成端口的,可是我不能给你源代码,只能给你一个链接库,以解燃眉之急。
      

  8.   

    至于你上面的问题,可以说没有必要为每一个连接打开缓冲区,甚至创建新的线程,可以设置一个最大的连接数量,超过他或者主动断开新的连接或者将该连接存入队列。再有就是一千个连接对于完成端口来说,没有问题,如果有问题,只要增加cpu,他的性能会直线上升的。
      

  9.   

    我说的缓存指的是记录用户相关信息和通讯缓存区的数据类型,不是线程。对于文件服务器数据处理不是很占CPU资源的,又是异步模式,开几个工作线程就够了。如果只是下载文件,问题很简单,只要共享方式打开就可以了。
      

  10.   

    Delphi可以作完成端口的,我就用Delphi作了一个简单的完成端口例子。网上有winsock2.pas的单元。
      

  11.   

    难道用delphi的就没有完成端口的高手?