我最近完成了一个基于TCP的循环并发服务器,其基本流程为:
         socket();
         bind();
         listen();
while(1){  
s= accept(h_socket, (struct sockaddr*)&from,&fromlen);
if(s!=SOCKET_ERROR){  
pQueue[iFirst].client=s; 
pQueue[iFirst].from=from; 
AfxBeginThread(AcceptTCPClient,(LPVOID)&pQueue[iFirst]);
         }
        }
其中AcceptTCPClient为负责与客户端交互的子线程,负责接收客户端上传的文件,经实验检验,可以与多个客户端同时很好的交互。同时我还想做一个可以同时与多个客户端交互的UDP服务器,也是实现多客户端同时文件上传的功能,具体的交互模式基于停止等待协议,以便实现可靠传输,但一直没有找到合适的并发服务器模型。如果使用上面的框架,由于基于UDP的套结籽不支持accept操作,故TCP下可以阻塞的accept在此处就会运行失败,导致无法产生专门的子线程;如果不使用这个框架,那该如何做呢?希望众高手不吝赐教,欢迎提供主要的代码。

解决方案 »

  1.   

    http://fanqiang.chinaunix.net/a4/b7/20010508/112359.html
      

  2.   

    要自己实现session状态保持,为每一个session分配一个context记录相关信息。 并且网络接收与数据处理要分开, 在不同的线程之间完成, 之间的数据接口形式可以为一个队列。
      

  3.   

    to kingzai(stevenzhu):
    谢谢,这篇文章我已经看过了,能够大致明白一些道理,但是感觉对我的帮助不是很大,它讲的基于LINUX/UNIX实现,换到WINDOWS下并不能很好的实现。
    to flashboy(爱写程序的小绵羊) : 
    谢谢,由于程序中服务器与客户端交互的逻辑比较复杂(基于select()模型,每接收客户端的一个数据包,就要分析,写文件,然后发应答报文,另外还有重发机制),所以您提供的思路虽然可行,但是如果我以此来修改程序的话,会有点复杂(时间比较紧迫)。最新进展:
    我已经基于select()模型实现了循环服务器模式,服务器能循环处理客户端发来的文件,每次只为一个客户服务。
    但是我还是很想知道并发服务器模式怎么实现,另外,线程池可不可以应用于并发服务器模式呢?如果可以,那该如何做呢?
      

  4.   

    服务端在recvfrom调用处堵塞,当有udp数据包到达时,函数返回并得到一个呼叫方的sockaddr,然后创建线程,在线程中创建一个面向连接的udp socket,connect到这个sockaddr上于客户端通信,主线程在recvfrom循环等待
      

  5.   

    楼上的思路比较诡异,我先来介绍一下我设计的服务器与客户端交互的过程:
    第一次交互,客户端发送待上传的文件名到服务器,服务器给予它以收到文件名的应答,然后服务器创建文件;
    此后,客户端开始分片上传文件(每个数据片有4个字节的编号,数据片长度为1024字节,除非文件长度不是1024的整数),服务器收到数据报后给予收到此数据片的应答,如此循环,直至服务器端收到了长度小于4+1024的数据报,说明文件已传输完毕,服务器给予传输完毕的应答,客户端在收到此应答后,关闭套结字,结束传输。如果以你的思路进行修改的话,交互流程就要大大的改变,得不偿失阿,还是按照flashboy的思路更合理一些。