经典指数          
原因
1945
浏览数
0
收藏数
 

TCP服务器在启动时,需要经过socket、bind、listen和accept四个步骤。 listen_fd = socket(TCP); bind(listen_fd, my_addr); listen(listen_fd, backlog); while(true) { client_fd = accept(listen_fd); read(client_fd, request); response = process(request); write(client_fd, response); close(client_fd); } 一个单进程的服务器的伪代码如下: 某客户端的伪代码如下: write(fd, request); read(fd, response); display(response); close(fd); 假设服务器在04行执行了sleep(1000000): 问题1:请简介服务器四个步骤的意义或作用是什么? 问题2:当1个客户端访问该服务器时,客户端执行到哪行会失败?会发生阻塞吗?为什么? 问题3:当50个客户端从50台机器几乎同时访问该服务器时,各个客户端的反应有差别吗?为什么?(注:忽略防火墙因素)

     举报   纠错  
 
切换
1 个答案

问题1:

socket()创建一个套接字,包括domain(通信域,如IPV4/6等)、type(地址格式,如字节流或数据报等)、protocol(协议,默认为0);bind()是为了给这个套接字绑定上地址,多数用于服务器端,绑定一个众所周知的IP地址和端口;listen()要在accept之前,来宣告该套接字愿意接受连接请求,可以指定等待连接队列长度;accept()在listen成功后,在已完成的连接队列中返回一个连接,若为空,则阻塞,返回的是连接套接字。

问题2:客户端可以连接成功,即connect返回0,但是会阻塞在read上,因为,服务器在listen之后就sleep了,那么客户端发出连接时,服务器端的监听套接字可以完成连接,但是无法在已完成连接队列中返回一个连接套接字(accept做的事),这样,服务器端就无法响应客户端的写请求。这样,客户端就会阻塞在read调用上。

问题3:

这个需要看服务器端listen调用的第二个参数,如果小于50,则,这50个客户端就会有connect返回错误的,因为队列已满,服务器端不接受新的连接;

如果大于50, 所有客户端可以连接成功,但是会阻塞在read请求上,同问题2.

 
切换
撰写答案