Listen问题

问题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又可以去等待和接受新的连接请求,最后允许连接的个数只由你的应用程序和系统资源决定。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值