我最近完成了一个基于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在此处就会运行失败,导致无法产生专门的子线程;如果不使用这个框架,那该如何做呢?希望众高手不吝赐教,欢迎提供主要的代码。
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在此处就会运行失败,导致无法产生专门的子线程;如果不使用这个框架,那该如何做呢?希望众高手不吝赐教,欢迎提供主要的代码。
谢谢,这篇文章我已经看过了,能够大致明白一些道理,但是感觉对我的帮助不是很大,它讲的基于LINUX/UNIX实现,换到WINDOWS下并不能很好的实现。
to flashboy(爱写程序的小绵羊) :
谢谢,由于程序中服务器与客户端交互的逻辑比较复杂(基于select()模型,每接收客户端的一个数据包,就要分析,写文件,然后发应答报文,另外还有重发机制),所以您提供的思路虽然可行,但是如果我以此来修改程序的话,会有点复杂(时间比较紧迫)。最新进展:
我已经基于select()模型实现了循环服务器模式,服务器能循环处理客户端发来的文件,每次只为一个客户服务。
但是我还是很想知道并发服务器模式怎么实现,另外,线程池可不可以应用于并发服务器模式呢?如果可以,那该如何做呢?
第一次交互,客户端发送待上传的文件名到服务器,服务器给予它以收到文件名的应答,然后服务器创建文件;
此后,客户端开始分片上传文件(每个数据片有4个字节的编号,数据片长度为1024字节,除非文件长度不是1024的整数),服务器收到数据报后给予收到此数据片的应答,如此循环,直至服务器端收到了长度小于4+1024的数据报,说明文件已传输完毕,服务器给予传输完毕的应答,客户端在收到此应答后,关闭套结字,结束传输。如果以你的思路进行修改的话,交互流程就要大大的改变,得不偿失阿,还是按照flashboy的思路更合理一些。