问题1:
Listen()一般写为Listen(5);意思是,对于监听的端口K,可以同时接收5个Client的接入;若某时刻有10000个Client申请接入,则先接入其中的1~5号,再依次接入6,7,8,9,....,至10000,若这10000个都连接Server后的某时刻,同时有5000个Client向服务器发送数据,则先对其中的头5条进行及时处理,第6至5000条数据先暂时加入到数据队列中,此时第6至5000条数据的Client端的状态为“数据已经发出,请等候服务器的响应......”,服务器在处理完头5条数据后,再依次处理6~5000条数据。也就是说:在C/S应用中,服务器端的一个端口,可以连接上万个Client机,只是只能同时处理其中的5个请求,对于多于的请求也能处理,只是得等到前面的请求处理完毕后才行。我的观点对吗?
问题2:
一般的书中,在介绍Server端的程序时,说它要申请一块缓冲区(用ss表示)用于接收Client端数据,现假设某时刻有一条Client数据到达,则先将他接收到缓冲区,然后处理即可。现假设某时刻有2条Client数据到达,那么他们是同时被接收到ss(第一种猜想),还是被依次接收到ss(第二种猜想);
如是第一种猜想,那么Server端如何判断是来自2个Client的数据还是来自1个Client的长数据(自动还是得手工加入代码);
如是第2种猜想,那么Listen为什么写为Listen(5);应写为Listen(1)才对????
回答:
1.错,第6~5000条的客户端将得到服务器忙的信息从而连接立即失败,缓冲区仅保存5条请求。“同时接收5个Client的接入”也不对,接收动作是由应用程序来完成的,如果你不使用多线程的话,那么程序就是读入第1个连接,决定是否接受它的连接请求,完成后再去处理第2个连接的请求,因此不是“同时”的,总之,接受请求是由你的应用程序自己来完成的(这样才能决定接不接受某些特定的连接请求)。
2.数据到达后是存放在winsock内核的缓冲区中的,并且告诉的你的程序有新数据到达,此时数据并没有放到ss中。根据你的意思,由于前面有listen(),因此应该是使用TCP协议,根据这个协议每次建立连接时都生成一个新的socket来处理,因此这个新数据到达的消息将发送给各自连接时分配的socket,你使用某个socket来接收消息就对应着相应的client的消息。使用recv()接收消息,ss就会是其中的参数之一,因此你的应用程序调用recv()的时候,winsock内核才会将缓冲区中的消息复制到ss中来。如果你所有的client都用同一个socket,那么recvfrom()可以得到消息的同时得到client端的IP地址和端口号,从而确定Client端。
另外补充一,listen(5)并不表示你的程序只能同时处理5个连接,因为在完成连接请求后(即接收连接后)程序使用新建立的socket连接进行通信时,原socket又可以去等待和接受新的连接请求,最后允许连接的个数只由你的应用程序和系统资源决定。